中望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;
}

关注公众号,获取更多信息!
HFsoft

posted @   Wang_h_f  阅读(283)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示