VB注册全局快捷键的问题~~~~~~~~~~~~~~~~~
在网上找到了用RegisterHotKey、UnregisterHotKey注册快捷键的代码,调试之后能用,但是会出现一个问题。下面是主要代码:
'-------------------窗体
Private Sub Form_Load()
nowHwnd = FindWindow(0&, "测试窗体")
key_preWinProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
SetWindowLong Form1.hwnd, GWL_WNDPROC, AddressOf keyWndproc
RegisterHotKey Form1.hwnd, 1, 0&, vbKeyF7 '注册F7
RegisterHotKey Form1.hwnd, 2, 0&, vbKeyF8 '注册F8
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim ret As Long
ret = SetWindowLong(Form1.hwnd, GWL_WNDPROC, key_preWinProc)
UnregisterHotKey Form1.hwnd, 1
UnregisterHotKey Form1.hwnd, 2
End
End Sub
'-------------------模块
Public Function keyWndproc(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 '按下F7
'处理过程略
End If
If (wParam = 2) Then '按下F8
'处理过程略
End If
End If
keyWndproc = CallWindowProc(key_preWinProc, hwnd, Msg, wParam, lParam)
End Function
当我打开测试窗体,再启动这段程序,按下F7,F8可以完成处理过程;自己手动关闭测试窗体再次启动窗体快捷键也能用;开
两个测试窗体分别按快捷键同样能用。但是就有一个问题出现了,我的测试窗体上有一个按钮,功能是完成一个处理过程后重新启动窗体,这个时候再按注册的快捷键就不能用了。必须要把测试窗体手动关闭掉在启动才能,就算重新启动这个程序也不行。是不是SetWindowLong 和CallWindowProc这里的问题,测试窗体的句柄好像根本没地方用啊,CallWindowProc的第二个参数hwnd是哪里来的,是不是没把消息送到启动后的窗体去啊
说的有点啰嗦,经常来CSDN但这是第一次提问,希望达人们帮帮忙,万分感谢。
--------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- 同上 --------------------编程问答-------------------- 用unload或者set XX=null强制释放窗体试试 --------------------编程问答-------------------- 还是没能解决。用SetWindowsHookEx重新写了代码,出现的还是同样的问题。 --------------------编程问答-------------------- http://www.m5home.com/blog/article.asp?id=245
使用HOOK不太可能也这样
除非你自己的流程里没写对.
如果是我做这个多窗体响应同一键的事情,我会把HOOK事件放在一个公有类里,然后在每个窗体里将窗体内的私有类SET为这个公有类.
这样窗体无论怎么样LOAD,均可正确处理相应的事件. --------------------编程问答--------------------
补充:VB , API