用到了鼠标钩子和坐标转换, 启动钩子后,程序会一直捕捉你的鼠标响应,会一直执行你实现的代码,所以在数据的处理上一定要严格,不能出现变量未初始化和空指针等情况,不然会造成程序闪退,在程序执行完一定要将钩子卸载干净,不然也会造成程序闪退。如果你遇到类似问题解决不掉可以关注博主,给博主留言。
LRESULT CALLBACK hookproc(UINT nCode,WPARAM wParam,LPARAM lParam);//声明在静态全局
void GetScreenPt(HWND delta,POINT pt,double screenXYZ[3]);
HHOOK hook = NULL;
//卸载钩子
if(hook!=NULL)
{
UnhookWindowsHookEx(hook);
hook = NULL;
}
//钩子启动
DWORD id =GetCurrentThreadid();
hook =SetWindowsHookEx(WH_MOUSE,(HOOKPROC)hookproc,NULL,id);
//获取视图坐标
void GetScreenPt(HWND delta,POINT pt,double screenXYZ[3])
{
tag_t workView;//初始工作视图
double clip[4]={0.0,1.0,0.0,1.0};
UF_VIEW_ask_work_view(&workView);
UF_VIEW_ask_current_xy_clip(workView,clip);
RECT drew={0};
GetWindowRect(delta,&draw);//获取绘图区在屏幕的大小
long length = draw.right - draw.left;
long width = draw.bottom-draw.top;
double xScale = (double)(pt.x-draw.left)/length;
double yScale = (double)(draw.bottom-pt.y)/width;
screenXYZ[0]=clip[0]+(clip[1]-clip[0])*xScale;//X
screenXYZ[0]=clip[2]+(clip[3]-clip[2])*yScale;//Y
}
LRESULT CALLBACK hookproc(UINT nCode,WPARAM wParam,LPARAM lParam)
{
if(wParam == WM_MOUSEMOVE)//只处理鼠标移动时的响应
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR*)lParam;
POINT pt = pMouseHook->pt;//像素坐标
HWND delta= WindowFromPoint(pt);
HWND parent = GetParent(delta);
TCHAR className[100] = TEXT("");
GetClassName(parent,className,2);
if(className[0]=='A'&&className[string(className).size-1]!='0'&&className[21]=='b'&&string(className).size()==73)
{
if(string(className).substr(string(className).find('b'))[17]!='0')
{
//计算NX视图坐标
double screenXYZ[3]={0,0,0};
GetScreenPt(delta,pt,screenXYZ);
//视图坐标转绝对坐标
double temp=0.0;
double csys[12]={0.0};
uc6430("",&csys[0],&temp);
uc6433("",&csys[3]);
double mtx[9]={0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0};
double matrix[12]={0.0};
int status =0;
uf5940(csys,mtx,matrix,&status);
uf5941(screenXYZ,matrix);
///此处添加需要实现的代码
}
}
}
return CallNextHookEx(hook,nCode,wParam,lParam);
}