马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
关于WINDOWS系统的消息循环可以网络搜索,参考文献。
WINDOWS系统的所有软件都是通过消息循环和系统交互,我们按下键盘或者移动鼠标,WINDOWS系统会把消息发送到AUTOCAD,AUTOCAD接受消息处理并返回信息给系统。
那AUTOCAD接受到的系统键盘消息,通过ARX的钩子相关函数,可以截获,这个消息应用程序处理后可以继续传给AUTOCAD后续操作,也可以截获,让AUTOCAD不知道有这个“消息”过来,AUTOCAD也就不能继续响应消息然后操作。
一般的钩子函数定义如下:
 - BOOL HOOK(MSG *pMsg)
- {
- switch(pMsg->message){
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- if (...)
- {
- return TRUE; // TRUE 截获消息,不让AUTOCAD继续处理。
- }
- break;
- }
- return FALSE;// 返回FALSE,AUTOCAD可以继续接受该消息
- }
那A/VLISP能不能也截获消息处理呢,不能,LISP没提供这样的功能。
下面通过XDRX API提供给LISP的自定义函数,来完成上面的操作。
API提供的“钩子”相关的函数有:
 - xdrx-hook-register
- xdrx-hook-enable
- xdrx-hook-status
- xdrx-hook-remove
- xdrx-hook-tracemouse
- xdrx-hook-block-messageloop
- xdrx-system-keystate
- xdrx-system-ctrl-down
- xdrx-system-ctrl-shift-down
- xdrx-system-ctrl-alt-shift-down
- xd::hook:register
- xd::hook:enable
- xd::hook:remove
xdrx-hook-block-messageloop函数的作用相当于上面说的return TRUE,终止消息继续给AUTOCAD。
LISP的典型钩子回调函数结构如下:
 - (defun hook (hwnd msg wparam lparam time pos)
- ;|
- hwnd -- 窗口句柄
- msg --- 消息
- wparam -- 主参数
- lparam ---- 第二参数
- time ------- 发生时间
- pos ------- 鼠标屏幕坐标
- |;
- (cond ((= msg WM_KEYUP) ;按键抬起
- )
- ((= msg WM_KEYDOWN) ;键按下
- (setq txt (chr wparam))
- )
- ((= msg WM_SYSKEYDOWN)) ;系统键按下
- ((= msg WM_CHAR)
- )
- ((= msg WM_MOUSEWHEEL) ;拨动滚轮
- )
- ((= msg WM_LBUTTONUP) ;鼠标左键弹起
- )
- ((= msg WM_LBUTTONDOWN) ;鼠标左键按下
- )
- ((= msg WM_LBUTTONDBLCLK) ;鼠标左键双击
- )
- ((= msg WM_RBUTTONUP) ;鼠标右键弹起
- )
- ((= msg WM_RBUTTONDOWN) ;鼠标右键按下
- )
- ((= msg WM_RBUTTONDBLCLK) ;鼠标右键双击
- )
- ((= msg WM_MBUTTONUP) ;鼠标中键弹起
- )
- ((= msg WM_MBUTTONDOWN) ;鼠标中键按下
- )
- ((= msg WM_MBUTTONDBLCLK) ;鼠标中键双击
- )
- ((= msg WM_MOUSEMOVE) ;鼠标移动
- )
- ((= msg WM_PAINT) ;屏幕绘制
- )
- ((= msg WM_HOTKEY) ;热键
- )
- ((= msg WM_INPUT) ;输入
- )
- ((= msg WM_VSCROLL) ;屏幕滚动
- )
- )
- )
下面通过一个ODCL的捕获鼠标热键的程序说明:
下面程序会把键盘的按键,包括CTRL,SHIFT,ALT和字母键的组合,实时写到文本框里面。
|