中望CAD 注册钩子,实现点击命令行选项自动输入
- 在中望CAD2018、2019中还未实现通过点击命令行直接输入命令的效果(如上图)。于是自己试着实现玩玩,完成后发出来分享一下。
//只需在初始化时注册钩子
acedRegisterFilterWinMsg(toCaps);
BOOL toCaps(MSG* pMsg)
{
if (pMsg->message == WM_LBUTTONDOWN)
{
CWnd *pWnd = acedGetAcadDockCmdLine();
HWND hwnd = ::FindWindowEx(pWnd->m_hWnd, NULL, NULL, _T("CommandLine"));//借助spy++查看
//点击了命令行
if (pMsg->hwnd == hwnd)
{
CPoint ptLeftClk = pMsg->pt;;
CString sCmdText;
CWnd *pCmdWnd = CWnd::FromHandle(hwnd);
pCmdWnd->GetWindowTextW(sCmdText);
HDC hDC = ::GetDC(hwnd);
CDC dc;
dc.Attach(hDC);
int index = sCmdText.Find(_T("/"));
std::map<CString, CPoint> mapOptions;
int size1 = 0;
int size2;
CString sOption;
while (index != -1)
{
size2 = dc.GetOutputTextExtent(sCmdText.Left(index+4)).cx;
sOption = sCmdText.GetAt(index - 2);
mapOptions[sOption] = CPoint(size1, size2);
size1 = size2;
index = sCmdText.Find(_T("/"),index+1);
}
size2 = dc.GetOutputTextExtent(sCmdText).cx;
if (sCmdText.Find(L"[") != -1)
{
sOption = sCmdText.GetAt(sCmdText.ReverseFind(_T(']')) - 2);
mapOptions[sOption] = CPoint(size1, size2);
}
dc.Detach();
CRect rc;
::GetWindowRect(hwnd, rc);
rc.right = rc.left + size2;
if (rc.PtInRect(ptLeftClk))
{
int nResult = ptLeftClk.x - rc.left;
std::map<CString, CPoint>::iterator iter;
for (iter = mapOptions.begin(); iter != mapOptions.end(); iter++)
{
if (nResult >= (iter->second.x) && nResult <= (iter->second.y))
{
acDocManager->sendStringToExecute(curDoc(), iter->first + L" ");
break;
}
}
}
}
}
return FALSE;
}
关注公众号,获取更多信息!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律