明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2568|回复: 5

如何捕捉键盘事件?

[复制链接]
发表于 2005-8-9 22:53:00 | 显示全部楼层 |阅读模式
请问如果在AutoCAD主界面下按下某键,请问如何用写VBA代码捕捉这个事件?好像需要用到Windows API函数,请问这个函数是什么?先谢谢大家了~~
发表于 2005-8-12 16:59:00 | 显示全部楼层

可以使用hotKey。

本帖最后由 作者 于 2005-8-12 22:15:23 编辑

1、新建一个 模块,加入以下代码:

Option Explicit
'新建一个模块,粘贴这里代码。
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
                        ByVal hwnd As Long, _
                        ByVal nIndex As Long, _
                        ByVal dwNewLong As Long _
                        ) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _
                        ByVal OldwndProc As Long, _
                        ByVal hwnd As Long, _
                        ByVal wMsg As Long, _
                        ByVal wParam As Long, _
                        ByVal lParam As Long _
                        ) As Long
Public Const GWL_WNDPROC = -4
Public OldwndProc As Long
Public Declare Function RegisterHotKey Lib "user32" ( _
                        ByVal hwnd As Long, _
                        ByVal HotKeyID As Long, _
                        ByVal fsModifiers As Long, _
                        ByVal vKey As Long _
                        ) As Long
Public Declare Function UnregisterHotKey Lib "user32" ( _
                        ByVal hwnd As Long, _
                        ByVal HotKeyID As Long) As Long

Public HKeyID As Long '定义热键,需要注册多个热键可以使用数组

Public Function WindowProc( _
                         ByVal hwnd As Long, _
                         ByVal WindowMsg As Long, _
                         ByVal wParam As Long, _
                         ByVal lParam As Long) As Long
    Select Case WindowMsg
        Case WM_HOTKEY
            Select Case wParam
                Case HKeyID
                    MsgBox "在这里添加需要执行的代码或者函数"
            End Select
     End Select

WindowProc = CallWindowProc(OldwndProc, hwnd, WindowMsg, wParam, lParam)

End Function

2、然后在Form_Load中添加代码来注册热键:

Private Sub Form_Load()
    Dim ReturnValue As Long
    OldwndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
    '定义HOME键为热键
    ReturnValue = RegisterHotKey(hwnd, HKeyID, 0, 36)
End Sub

3、在Form_Unload中添加代码来卸载热键:

Private Sub Form_Unload(Cancel As Integer)
    Dim ReturnValue As Long
    ReturnValue = UnregisterHotKey(hwnd, HKeyID)
End Sub

发表于 2005-8-12 17:55:00 | 显示全部楼层
送花一朵!!
 楼主| 发表于 2005-8-13 08:40:00 | 显示全部楼层
谢谢冬雪随风~~
 楼主| 发表于 2005-8-13 11:20:00 | 显示全部楼层

to:冬雪随风

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

发表于 2005-8-18 10:01:00 | 显示全部楼层

刚出差回来..以上代码在VB SP6下调试通过。
以上代码是用VB来开发AUTOCAD的。
我看了一下AUTOCAD里面的VBA。好像没有找到FORM的hWnd句柄,也没有LOAD和UNLOAD。
看来大家可以再研究研究。VBA能否实现。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-27 12:53 , Processed in 0.203875 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表