翔羽 发表于 2005-8-9 22:53:00

如何捕捉键盘事件?

请问如果在AutoCAD主界面下按下某键,请问如何用写VBA代码捕捉这个事件?好像需要用到Windows API函数,请问这个函数是什么?先谢谢大家了~~

冬雪随风 发表于 2005-8-12 16:59:00

可以使用hotKey。

本帖最后由 作者 于 2005-8-12 22:15:23 编辑 <br /><br /> <P>1、新建一个 模块,加入以下代码:</P>
<P>Option Explicit<BR>'新建一个模块,粘贴这里代码。<BR>Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal hwnd As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal nIndex As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal dwNewLong As Long _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) As Long<BR>Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal OldwndProc As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal hwnd As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal wMsg As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal wParam As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal lParam As Long _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) As Long<BR>Public Const GWL_WNDPROC = -4<BR>Public OldwndProc As Long<BR>Public Declare Function RegisterHotKey Lib "user32" ( _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal hwnd As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal HotKeyID As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal fsModifiers As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal vKey As Long _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) As Long<BR>Public Declare Function UnregisterHotKey Lib "user32" ( _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal hwnd As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal HotKeyID As Long) As Long</P>
<P>Public HKeyID As Long '定义热键,需要注册多个热键可以使用数组</P>
<P>Public Function WindowProc( _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByVal hwnd As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal WindowMsg As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal wParam As Long, _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal lParam As Long) As Long<BR>&nbsp;&nbsp;&nbsp; Select Case WindowMsg<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case WM_HOTKEY<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select Case wParam<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case HKeyID<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox "在这里添加需要执行的代码或者函数"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Select<BR>&nbsp;&nbsp;&nbsp;&nbsp; End Select</P>
<P>WindowProc = CallWindowProc(OldwndProc, hwnd, WindowMsg, wParam, lParam)</P>
<P>End Function</P>
<P>2、然后在Form_Load中添加代码来注册热键:</P>
<P>Private Sub Form_Load()<BR>&nbsp;&nbsp;&nbsp; Dim ReturnValue As Long<BR>&nbsp;&nbsp;&nbsp; OldwndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)<BR>&nbsp;&nbsp;&nbsp; '定义HOME键为热键<BR>&nbsp;&nbsp;&nbsp; ReturnValue = RegisterHotKey(hwnd, HKeyID, 0, 36)<BR>End Sub</P>
<P>3、在Form_Unload中添加代码来卸载热键:</P>
<P>Private Sub Form_Unload(Cancel As Integer)<BR>&nbsp;&nbsp;&nbsp; Dim ReturnValue As Long<BR>&nbsp;&nbsp;&nbsp; ReturnValue = UnregisterHotKey(hwnd, HKeyID)<BR>End Sub<BR></P>

wyj7485 发表于 2005-8-12 17:55:00

送花一朵!!

翔羽 发表于 2005-8-13 08:40:00

谢谢<A name=50998><FONT color=#000066><B>冬雪随风</B></FONT></A>~~

翔羽 发表于 2005-8-13 11:20:00

<P>to:<A name=50998><FONT color=#000066><B>冬雪随风</B></FONT></A></P>
<P>我看了你的代码,这段代码在VBA中运行的时候没有反应,没有达到所要求的目的,任意按下键盘中的任何一个键,没有提示消息,请问这段代码怎么用?不知道这段代码你运行过没有,我用的是2002版本的。然后,我觉得你在调用SetWindowLong,RegisterHotKey,UnregisterHotKey函数的时候,没有给定输入参数hwnd, HKeyID赋值,当我给hwnd赋值为thisdrawing.hwnd的时候,运行程序,自动关闭了AutoCAD程序,请问这是什么原因?请指导,谢谢~~</P>

冬雪随风 发表于 2005-8-18 10:01:00

<P>刚出差回来..以上代码在VB SP6下调试通过。<BR>以上代码是用VB来开发AUTOCAD的。<BR>我看了一下AUTOCAD里面的VBA。好像没有找到FORM的hWnd句柄,也没有LOAD和UNLOAD。<BR>看来大家可以再研究研究。VBA能否实现。</P>
页: [1]
查看完整版本: 如何捕捉键盘事件?