Делаю так:
Описываю в модуле формы функции 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)? Тогда, какой верный?
Access, как перехватить сообщения окну (WindowProc)?
Модератор: Naeel Maqsudov
Все, разобрался. Индекс для получения адреса процедуры-обработчика другой - (-4), а не (-6). И называется правильно константа GWL_WNDPROC, а не GWL_HINSTANCE.
Чего-то в справочнике было напутано.
Чего-то в справочнике было напутано.