Access, как перехватить сообщения окну (WindowProc)?

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
KSA
Сообщения: 10
Зарегистрирован: 18 май 2005, 18:15

Делаю так:

Описываю в модуле формы функции Win API, переменную для сохранения адреса стандартной WindowProc и константу (-6):

Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Dim PrevWP As Long

Const GWL_HINSTANCE = (-6)



В общем модуле делаю процедуру:

Public Function NewWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
NewWindowProc = CallWindowProc(PrevWP, hWnd, Msg, wParam, lParam)
End Function


В модуле формы ставлю на событие открытия:

Private Sub Form_Open(Cancel As Integer)

Dim PV As Long

PrevWP = GetWindowLong(Me.hWnd, GWL_HINSTANCE)
PV = SetWindowLong(Me.hWnd, GWL_HINSTANCE, AddressOf NewWindowProc)
End Sub

Хотя, PV должно равняться PrewWP, при успешном выполнении. Но это - не суть.

Теперь, по-идее, сообщения форме должны перенаправляться в мою функцию, а в ней передаваться к стандартной. Но ничего такого не происходит. Пробовал строчку передачи сообщения стандартной функции закомментировать. При этом, окно должно было бы зависнуть, т.к. моя функция глотала бы все его сообщения. Но оно спокойно жило, как ни в чем не бывало. Ставил перед вызовом стандартной функции окна MsgBox. Опять - эффекта ноль.
Хотя, если просматривать пошагово значения, то GetWindowLong действительно вылавливает какое-то осмысленное значение (адрес). А на выходе SetWindowLong получается такое-же. Т.е., смена параметра производится.
Пробовал ставить после SetWindowLong еще один GetWindowLong - значение было иным. Т.е., параметр действительно сменился.
Так же менял Me.hWnd на Me.Form.hWnd (не знаю, как правильно) - на результат не повлияло.

В чем же дело? Почему сообщения в мой обработчик не попадают? Или я с индексом напутал, и он не (-6)? Тогда, какой верный?
KSA
Сообщения: 10
Зарегистрирован: 18 май 2005, 18:15

Все, разобрался. Индекс для получения адреса процедуры-обработчика другой - (-4), а не (-6). И называется правильно константа GWL_WNDPROC, а не GWL_HINSTANCE.

Чего-то в справочнике было напутано.
Ответить