При
работе с сообщениями Windows, когда приходится ставить Hook (Захват) на
форму, нельзя тестировать программу в среде Visual Basic, поскольку при
нахождении любой простой ошибки (даже синтаксической) вся система закрывается с
сообщением об ошибке (еще и не сохраняет последниие Ваши изменения в коде!).
В
таком случае для отладки приходиться комментировать код, содержащий элементы Hook,
а потом его опять раскомментировать (по 20 раз на день!).
Чтобы
не тратить время на такое "интересное" занятие, я использовал
условную компиляцию, с помощью которой одной строкой как
"переключателем" включается или выключается Hook на форму.
Рассмотрим
пример, когда нам необходимо контролировать потерю и получение фокуса нашей
программы.
В
отдельном модуле опишем саму функцию Hook, которая поможет отслеживать
события потери и восстановления фокуса программы:
Option Explicit
'------------------------------------------
'------------------------------------------
'потеря и восстановления фокуса
'------------------------------------------
'------------------------------------------
Private Const WM_ACTIVATEAPP = &H1C
Private Const GWL_WNDPROC = (-4)
Private Declare Function SetWindowLong Lib "user32"
Alias "SetWindowLongA"_
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As
Long) As Long
Private Declare Function CallWindowProc Lib "user32"
Alias "CallWindowProcA"_
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long,_
ByVal wParam As Long, ByVal lParam As Long) As Long
Private m_lWndProc As Long
Public Sub WindowHook(hWnd As Long)
m_lWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf MessageCenter)
End Sub
Public Sub WindowFree(hWnd As Long)
SetWindowLong hWnd, GWL_WNDPROC, m_lWndProc
End Sub
Private Function MessageCenter(ByVal hWnd As Long, ByVal Msg As
Long,_
ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_ACTIVATEAPP Then
If wParam Then
FormMain.OnAppActivate
Else
FormMain.OnAppDeActivate
End If
End If
MessageCenter = CallWindowProc(m_lWndProc, hWnd, Msg, wParam, lParam)
End Function
'------------------------------------------
'------------------------------------------
'потеря и восстановления фокуса
'------------------------------------------
'------------------------------------------
В
самом начале кода формы, на которую ставим Hook,
помещаем код:
'-----------------------------------------------
'---------------ВНИМАНИЕ------------------------
'на эту форму поставлен Hook:
'WindowHook hWnd в событии Form_Load
'WindowFree hWnd в событии Form_Unload
'для отладки программы обычными средствами VB
'отключите его:
#Const FlagHook = True 'включен
'#Const FlagHook = False 'откючен
'---------------ВНИМАНИЕ------------------------
'-----------------------------------------------
Итак,
в зависимости от того: нужно включть или отключить Hook на форму, Вы легким
движением руки оставляете не закомментированной соответствующую строчку и
больше не тратите на это время!
Для
включения Hook на форму в событие Form_Load помещаем такой код:
Private Sub Form_Load()
...
'---------------------------------------------------
#If FlagHook = True Then
WindowHook hWnd
#End If
'---------------------------------------------------
...
End Sub
Для
отключения Hook на форму в событие Form_Unload помещаем такой код:
Private Sub Form_Unload(Cancel As Integer)
...
'------------------------------------------------------------
#If FlagHook = True Then
WindowFree hWnd
#End If
'------------------------------------------------------------
...
End Sub
И
наконец код, описывающий поведение программы в случае потери и получения
фокуса.
'-----------------------------------------------
'восстановление фокуса
'-----------------------------------------------
Public Sub OnAppActivate()
...
'код в случае восстановления фокуса
...
End Sub
'-----------------------------------------------
'восстановление фокуса
'-----------------------------------------------
'-----------------------------------------------
'потеря фокуса
'-----------------------------------------------
Public Sub OnAppDeActivate()
...
'код в случае потери фокуса
...
End Sub
'-----------------------------------------------
'потеря фокуса
'-----------------------------------------------
Хорошая
вещь - условная компиляция!
Половый
Александр
Ноябрь
2003г.