本文主要是介绍中望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;
}
关注公众号,获取更多信息!
这篇关于中望CAD 注册钩子,实现点击命令行选项自动输入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!