Visual Basic, .NET, ASP, VBScript
 

   
 
Описание для автора не найдено
 
     
   
 

При работе с сообщениями 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г.

 

 
     

   
   
     
  VBNet рекомендует