NX二次开发跟随鼠标响应的动态预览

用到了鼠标钩子和坐标转换, 启动钩子后,程序会一直捕捉你的鼠标响应,会一直执行你实现的代码,所以在数据的处理上一定要严格,不能出现变量未初始化和空指针等情况,不然会造成程序闪退,在程序执行完一定要将钩子卸载干净,不然也会造成程序闪退。如果你遇到类似问题解决不掉可以关注博主,给博主留言。

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);
}

你可能感兴趣的:(UFUN,c++,windows)