我想实现一个全屏画线功能 
我设想的是在MouseProc中截获鼠标消息,然后发给我的主程序, 
然后由主程序完成绘图。 
代码如下: 
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam) 

 LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR*)lParam; 
 if(nCode>=0) 
 { 
  ::PostMessage(glDlg,wParam,NULL,MAKELPARAM(pMouseHook->pt.x,pMouseHook->pt 
.y)); 
  return 1; 
 } 
 return CallNextHookEx(glhHook,nCode,wParam,lParam); 

可是失败了,当点击在客户区外面时,主程序无法完成绘图工作,还经常非法操作。 
我这种方法错在那里?请指教

解决方案 »

  1.   

    try the following :if(nCode>=0) 
     { 
      ::PostMessage(glDlg,wParam,NULL,MAKELPARAM(pMouseHook->pt.x,pMouseHook->pt 
    .y)); 
      return 1; 
     } 
    else
     return CallNextHookEx(glhHook,nCode,wParam,lParam);
      

  2.   

    I don't know for Hook,so study it
      

  3.   

    不行阿,这个else有没有是一样的吧
    继续求教,很急
    :(
      

  4.   

    return 1; 是什么意思?
      

  5.   

    问题应该不在这里。
    1你应该作下测试,在你主程序接收鼠标消息的函数(onlbuttondown?)中看一看接收到的消息对不对。你可以把接收到的参数存到文件里,或用messagebeep等函数测试有效性,但千万别乱用messagebox之类开窗口的函数,这可能给你“一次痛苦的经历”。
    2另外我想,你如果想在客户区外绘图,就要用desktop的dc.这样:
    CWnd *pwndDesktop=CWnd::FormHandle(::getdesktopwindow());
    CWindowDC dc(pwndDesktop);
    //以后用此dc作所有绘画操作......
    3题外话,我觉得是不是只把鼠标按下和松开的消息发送给主程序。要是连mousemove也截获的话,会不会太占用资源了......
    4.希望你把主程序中的相关代码贴出来
      

  6.   

    return 1;的意思是不把该消息传递
      

  7.   

    See the link below, FYI :http://www.codeproject.com/dll/trackuseridle.asp
      

  8.   

    rivershan(笨猫)(C++/MFC/COM初学者) :
    可以,这样你可以自定义。
    对了,你对GINA了解吗?我想在WIN2000登陆之前运行我的EXE文件,在GINA中怎么修改
      

  9.   

    我的鼠标钩子怎么写得了?
    忘了~
    只是感觉这个拦截鼠标移动,然后不传出去不太好~
    机器没有VC/MSDN~
    :(
      

  10.   

    我的hook
    LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR*)lParam;
    if(nCode>=0)
    {
    MSG mess;
    if(wParam==WM_LBUTTONDOWN)
    mess.message=MY_1;
    else if(wParam==WM_MOUSEMOVE)
    mess.message=MY_2;
    mess.pt.x=pMouseHook->pt.x;
    mess.pt.y=pMouseHook->pt.y;
    ::SendMessage(glDlg,mess.message,0,0); return 1;
    }
    return CallNextHookEx(glhHook,nCode,wParam,lParam);
    }我的接受程序中用下面这个接受消息
    BOOL CClientDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if(m_bStart&&pMsg->message == MY_1)
    {
    CPoint point;
    point.x=pMsg->pt.x;
    point.y=pMsg->pt.y;
    SetCapture();
    m_pDC->MoveTo(point);
    m_bLBD=TRUE;
    }
    else if(m_bStart&&m_bLBD&&pMsg->message == MY_2)
    {
    CPoint point;
    point.x=pMsg->pt.x;
    point.y=pMsg->pt.y;
    m_pDC->LineTo(point);
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
    可是现在一点反映都没有了
    呜呜 :(
      

  11.   

    to:timepalette(时间调色板) 
    能不能告诉我你的qq什么的,这个问题好急的说
    谢谢
      

  12.   

    在dll中glDlg保存的是窗口句柄,
    我已经写成全局并且共享数据了
    :(
      

  13.   

    你应当把消息发送给你主程序。我建议如下:
    一。::SendMessage(glDlg,mess.message,0,0);语句改为:
    ::SendMessage(glDlg,MY_1,0,lParam);
    二。在PreTranslateMessage接受lParam;
    然后初始化:LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR*)lParam;得到PMouseHook.x,pMouseHook.y;
    剩下的自己相应修改。
      

  14.   

    to fei:
    我的邮箱:[email protected]
    你把源码发过来,我试试
      

  15.   

    LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam;
    if (nCode<0)
    {
    return CallNextHookEx(glhHook,nCode,wParam,lParam);
    }

    if(wParam == WM_MOUSEMOVE)
    {
    POINT MousePoint;
    RECT rect;
    MousePoint=pMouseHook->pt;
    HWND hwnd=WindowFromPoint(MousePoint);
    ScreenToClient(hwnd,&MousePoint);
    rect.left=MousePoint.x-100;
    rect.top=MousePoint.y-3;
    rect.right=MousePoint.x+100;
    rect.bottom=MousePoint.y+3;
    InvalidateRect(hwnd,&rect,FALSE);
    }
    return CallNextHookEx(glhHook,nCode,wParam,lParam);//继续传递消息
    }
    我的是这么写的~
      

  16.   

    http://www.ithome-cn.net/technology/vc/vc148.htm
    這是勾子的程序.(鼠標或者鍵盤都有)
    我建議你用保存一個主窗口的指針.然後用->PostMessage
      

  17.   

    终于有点结果了,一个高手给我的解释如下:
    调用你的钩子时,你的钩子函数会判断父窗口的值是否等于glD
    lg,问题就出在这个地方,因为句柄值是进程相关的,也就是说,同一个窗口在不同的进程里的句柄值是不一样的。在其它进程地址空间里向一个句柄值为glDlg的窗口发消息,那么这个消息不知道发到哪里去了,也许句柄值为glDlg的窗口根本就不存在。
    然后请看下面这个例子,
    可以在mousemove的时候显示窗体的标题,
    GetWindowText(glhTargetWnd,szCaption,100);
    //glhTargetWnd是鼠标移动到的窗体的句柄,得到他的标题
    if(IsWindow(glhDisplayWnd))

    SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
    //glhDisplayWnd是主程序中一个Edit的句柄
    SendMessage(glDlg,WM_MY1,0,0);
    //glDlg是主程序对话框的句柄

    //结果是给Edit发消息有效,给窗体就无效,想不通阿
    大家讨论讨论吧
         
      

  18.   

    我用wh_keyboard钩子,获得其他进程的键消息给主程序处理,没遇到过你说的这种情况阿.键盘和鼠标钩子应该是一样的啊,不懂.
      

  19.   

    我也不懂,最离谱的是是给Edit发消息有效,给窗体就无效。
    句柄是这样传给钩子的
    在dlg中:
    CWnd* pwnd=GetDlgItem(IDC_EDIT1);
    m_hook.StartHook(pwnd->GetSafeHwnd(),AfxGetApp()->GetMainWnd()->GetSafeHwnd());
    有什么问题吗?
    这几天我糊涂死了。
    :(
      

  20.   

    你换个方式呢,你能确定消息发过去了吗,或者接收到了吗,要不在virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );中处理看看
      

  21.   

    TO   foolfei(fei):
    不好意思,这几天一直在忙其它的事情。
    我已经按照你的意思写了一个最简化的程序,不敢写太多代码怕跟你的意图不一样.你看看效果:
    http://www.angelfire.com/falcon/canyoufly/line.zip(源程序+可执行文件+dll)。大家共同研究。
      

  22.   

    TO   foolfei(fei):
    不好意思,这几天一直在忙其它的事情。
    我已经按照你的意思写了一个最简化的程序,不敢写太多代码怕跟你的意图不一样.http://www.angelfire.com/falcon/canyoufly/line.zip(源程序+可执行文件+dll)。
    效果是程序运行时,任何时候都会在鼠标左键点击后在鼠标的位置画一个矩形。
    大家共同研究。