Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As DelegateWindowProc) As Long
Public 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
Public Delegate Function DelegateWndProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Function wndproc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY Then
If wParam = 1 Then ..
msgbox(“已注冊”)
End If
End If
'與form_load中的ADDRESSOF WNDPROC對應
wndproc = CallWindowProc(preWinProc, hWnd, Msg, wParam, lParam)
End Function
SetWindowLong(Me.Handle, GWL_WNDPROC, AddressOf WndProc)
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As DelegateWindowProc) As Long
工具:vs2012
語言:vb
一直無法正常注冊熱鍵
1. dwNewLong 的資料型別改為Long出現以下錯誤,網上很多代碼都是這樣,不能正常編譯
error:“AddressOf”運算式不能轉換為“Long”,因為“Long”不是委托型別。
2.修改為ByVal dwNewLong As DelegateWindowProc后 則出現以下錯誤:
error::Module1::SetWindowLong”的呼叫導致堆疊不對稱。原因可能是托管的 PInvoke 簽名與非托管的目標簽名不匹配。請檢查 PInvoke 簽名的呼叫約定和引數與非托管的目標簽名是否匹配
3.function“wndproc”隱藏基 class“Form”中的可重寫方法。若要重寫基方法,必須將此方法宣告為“Overrides”。
4.修改為 Public Overrides sub wndproc
error:sub“wndproc”不能宣告為“Overrides”,因為它不重寫基 class 中的 sub。
求修正錯誤,或可正確編譯運行代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/155893.html
標籤:API
