highflybir 发表于 2009-5-5 01:23:00

【飞鸟集】简介钩子技术在AutoCAD中的应用

很久没摸arx了,不久看到了一篇介绍钩子技术在 AutoCAD中应用的文章,不敢独享,特此奉献给大家。

钩子技术是很有用的一种技术,它如同给函数挂上一个钩子(我们自己的函数),让它在执行前先执行我们挂的钩子(我们挂接的函数),从而达到拦截事件和函数调用等的目的。在autocad中,利用钩子技术可以为我们做很多事情:如建立快捷键(不希望更改已有菜单),等待或者触发特定消息(如鼠标,键盘),可以获得比反应器更强大的功能,等等。

objectARX提供了几种向autocad注册钩子函数的ARX API函数,见下面:

acedRegisterFilterWinMsg,注册一个钩子函数
acedRemoveFilterWinMsg,注销一个钩子函数
acedRegisterWatchWinMsg, 监测钩子函数
acedRemoveWatchWinMsg, 移除监测函数

其具体用法各位不妨参考帮助文件。

下面函数提供一个例程,该例程定义了一个快捷命令 Ctrl+I,当用户按下快捷键时候,autocad 将执行appload命令。

我这里采用了向导方式创建了一个新工程Hook
采不采用MFC对这个程序没有影响.

在acrxEntryPoint.cpp 中开头添加如下代码:
#include <aced.h>               //仅因为版本较低,所以加了这两个
#include <rxmfcapi.h>         //对于高版本无须此两个
并申明函数:




//------------------------------------------------------------------------------------------------
//函数原型及其全局变量申明
void sendCommandToAutoCAD(HWND hWndAcad,CString cmd);   //向AutoCAD窗口发送字符串命令(cmd)
void watchCtrlI(const MSG * pMsg);      //钩子监测函数
void Accelerator(void);            //快捷键注册函数
static BOOL filterCtrlKeyDone = FALSE;               
//------------------------------------------------------------------------------------------------

函数定义


voidAccelerator(void)
{
if(filterCtrlKeyDone == TRUE)
{
acutPrintf(_T("Hook has already been registered!\n")); //如果钩子已经注册,则返回
return;
}
if(acedRegisterWatchWinMsg(watchCtrlI) == FALSE)
acedPrompt(_T("Hook can't be registered!\n"));          //无法注册钩子
else
{
acedPrompt(_T("Shortcut Ctrl+I has been defined!\n"));//快捷命令Ctrl + I 已经定义
filterCtrlKeyDone = TRUE;
}
return;
}
//钩子监测函数,监测Ctrl+I键盘消息
void watchCtrlI(const MSG *pMsg)
{
if (pMsg->message == WM_CHAR && pMsg->wParam == 9)   //发生键盘Ctrl + I消息
{
sendCommandToAutoCAD(adsw_acadMainWnd(), _T("appload\n"));
                //这里可以是你自己定义的任何函数
}
return;
}
//向AutoCAD窗口发送字符串命令(cmd)
void sendCommandToAutoCAD(HWND hWndAcad,CString cmd)
{
if(! hWndAcad)
return;
COPYDATASTRUCT cmdMsg;
cmdMsg.dwData = (DWORD)1;
cmdMsg.cbData = (DWORD)_tcslen(cmd) + 1;
cmdMsg.lpData = cmd.GetBuffer(cmd.GetLength() + 1);
SendMessage(hWndAcad,WM_COPYDATA,(WPARAM)hWndAcad, (LPARAM)& cmdMsg);
return;
}
修改一下初始化入口On_kInitAppMsg和卸载函数On_kUnloadAppMsg
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
// TODO: Load dependencies here
// You *must* call On_kInitAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;

// TODO: Add your initialization code here
//我在这里添加到了初始化,如果你感觉不好的话,可以定义到命令组里
Accelerator();

return (retCode) ;
}
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
// TODO: Add your code here
// You *must* call On_kUnloadAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
// TODO: Unload dependencies here

//卸载arx程序前卸载钩子函数
if(filterCtrlKeyDone == TRUE)
{
   acedRemoveWatchWinMsg(watchCtrlI);
   acutPrintf(_T("\nHook has been removed!\n"));
}

return (retCode) ;
}
编译后,形成arx,加载hook.arx,然后当你用快捷键的时候,你就会发现弹出appload对话框了。
最终效果如下图:


如果你感觉到代码不好读或者有出入,见我下面的附件:

在vs2002 + arx2006 + autocad2006 编译成功并运行正确。

我这个例子很简单,希望大家讨论。并在此感谢原创者。
这个利用钩子技术在autocad 中定义快捷命令的思路,具有较大的启发意义。因为,对于在autocad 平台上开发cad系统来说,如果直接与autocad建立底层联系(如等待或者触发特定的消息),利用钩子技术是很必要的。






你有种再说一遍 发表于 2024-7-1 15:54:23

jun353835273 发表于 2024-6-19 23:34
输入法切换百花齐放,高飞大神能否搞一个呢,感觉天正的文字识别这个钩子能行,在执行天正操作之前先把输入 ...

难道IFox不能完成你的需求?

LL_Zz 发表于 2020-2-29 10:49:23

我写了一个关于钩子函数的应用,实现鼠标中键滚动,旋转所选实体的角度的代码原文链接:
https://www.cnblogs.com/HelloQLQ/p/12160678.html

jun353835273 发表于 2024-6-19 23:34:09

输入法切换百花齐放,高飞大神能否搞一个呢,感觉天正的文字识别这个钩子能行,在执行天正操作之前先把输入法给切换了。

BDYCAD 发表于 2009-5-5 10:20:00

<p>天啊!!! 很不夸张说一句,这些算是很深的技术哦!!</p><p>我还不懂这么多,有空向楼主学习这方面的!</p>

nogirlfriend 发表于 2009-5-5 17:50:00

<p>向楼上的学习。。。。</p>

cherwey 发表于 2009-7-14 14:21:00

<p>这个是过滤器 技术 ,不是钩子技术。</p><p>当然这是一个解决问题的好技术。在j2ee里面,filter 技术很常见。</p><p>也可以用 setwinlong 来挂自己的window prc</p><p>谢谢楼主分享~</p>

Casa小宝 发表于 2013-5-13 22:10:36

请问alt开头的组合键的键码是多少呢,网上也查不到。。

BDYCAD 发表于 2013-5-15 11:37:19

楼主,能否写个娶鼠标中键单击或滚动时的程序来参考一下?我在JGI或acedGrRead涵数,也只能取的取鼠标的左键和右键
不知如何写中键的程序出来,向楼主求学了。

killer9806 发表于 2013-5-28 23:40:42

按照楼主提供的方法,在cad中实现了。谢。

CSofAndy 发表于 2013-6-19 09:06:47

谢谢楼主,向楼主学习了!

mj0000 发表于 2013-6-28 14:59:33

很深奥,表示不懂,但是支持

lnpower 发表于 2014-1-21 12:24:22

好贴,学习了!
页: [1] 2
查看完整版本: 【飞鸟集】简介钩子技术在AutoCAD中的应用