- Код: Выделить всё
Private lpPrevWndProc As Long
Private Delegat As New DWindowProc(AddressOf WindowProc)
Private Declare Function SetWindowLong Lib "User32.dll" Alias "SetWindowLongA" (ByVal hWnd As IntPtr, _
ByVal nIndex As Integer, ByVal newWndProc As DWindowProc) As Long
Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" _
(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Long
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
lpPrevWndProc = SetWindowLongA(Me.Handle, GWL_WNDPROC, Delegat)
End Sub
Private Function WindowProc(ByVal hWnd As IntPtr, ByVal uMsg As UInteger, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Long
'Сообщения и hwnd здесь отлавливаются
Return DefWindowProc(hWnd, uMsg, wParam, lParam)
End Function
При установке перехвата, окно программы при перекрывании другими окнами начинает "затираться", т. е. на нем остаются отпечатки других окон. Хотя сообщения в функции перехвата отлавливаются. Долго искал решение на русских и английских сайтах, но ничего рабочего не нашел. Есть у кого-нибудь соображения что может быть не так?
В итоге я сделал перехват с помощью нетовской функции:
- Код: Выделить всё
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_... AndAlso m.LParam = hWnd... Then
Else
MyBase.WndProc(m)
End If
End Function
но хотелось бы все-таки разобраться почему не работает обычный вызов.