鉤子技術是很有用的一種技術,它如同給函數掛上一個鉤子(我們自己的函數),讓它在執行前先執行我們掛的鉤子(我們掛接的函數),從而達到攔截事件和函數調用等的目的。在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;
//------------------------------------------------------------------------------------------------
復制代碼
函數定義
void Accelerator(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("apploadn"));
//這里可以是你自己定義的任何函數
}
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建立底層聯系(如等待或者觸發特定的消息),利用鉤子技術是很必要的。
相關文章
- 2021-09-08BIM技術叢書Revit軟件應用系列Autodesk Revit族詳解 [
- 2021-09-08全國專業技術人員計算機應用能力考試用書 AutoCAD2004
- 2021-09-08EXCEL在工作中的應用 制表、數據處理及宏應用PDF下載
- 2021-08-30從零開始AutoCAD 2014中文版機械制圖基礎培訓教程 [李
- 2021-08-30從零開始AutoCAD 2014中文版建筑制圖基礎培訓教程 [朱
- 2021-08-30電氣CAD實例教程AutoCAD 2010中文版 [左昉 等編著] 20
- 2021-08-30電影風暴2:Maya影像實拍與三維合成攻略PDF下載
- 2021-08-30高等院校藝術設計案例教程中文版AutoCAD 建筑設計案例
- 2021-08-29環境藝術制圖AutoCAD [徐幼光 編著] 2013年PDF下載
- 2021-08-29機械AutoCAD 項目教程 第3版 [繆希偉 主編] 2012年PDF