我有一个问题,我在做一个能用鼠标在屏幕上绘图的工具。原理就是希望截获鼠标消息,在desktop上绘制,并不往相应的应用程序转发。
用hook函数,hook WH_MOUSE,但是我发现,如果鼠标从屏幕上的某个应用程序的client area开始点击绘制,
那么只能相应在这个应用程序的client区域进行绘制。无法超出绘制。
而从desktop的上面就可以在程序的任何地方绘制。而且如果点击某个应用程序的title bar,无法hook住此时down的鼠标消息。
我不知道有什么地方用错了hook函数,还是系统有什么特殊处理。没有什么思路。谢谢你们能帮助我!

解决方案 »

  1.   

    不知道喔...
    http://www.ithome-cn.net/technology/vc/vc148.htm
      

  2.   

    可是我见过一个绘图程序,它可以用键盘在下面的程序操作,证明不是考屏。只hook住了鼠标。
    希望有人可以帮助我!
      

  3.   

    我的问题简单的说就是怎么能够hook住鼠标消息不往下传递。
      

  4.   

    是不是只要return 1;就可以了。
      

  5.   

    return 1是不往下传递。
    但是我的问题是,我只能得到一个应用程序中的鼠标消息。我hook住的鼠标消息是WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,
    WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,WM_NCMOUSEMOVE。而这些已经是系统处理好的发给某个应用程序的鼠标消息。
    那么怎么hook住的鼠标事件呢?而不是处理好的消息。
      

  6.   

    我也是上個星期做的hook mouse.
    也是出現你所說的.我用的是我刷給你的網頁的方式.
    動態的呼叫hook mouse的對象可能只是針對建立hook的程序
    我想如果你想要捕獲所有的話.應該用系統勾子.做成dll
      

  7.   

    你要HOOK住所有的鼠标消息啊
    你说不能超一出个窗口
    估计是只HOOK住这一个窗口的消息
    或者你把DESKTOP的句柄得到
    HOOK住DESKTOP这个窗口试一试
      

  8.   

    谢谢大家,我做的是全局的hook, 因为我可以down在任何一个应用程序上,然后就只能在这上面响应。下一次down又可以在另一个上响应。
    我想原因可能是:系统扫描系统的事件队列,后判断event的对应的进程,如果不是当前运行的进程的话,会暂时放在系统队列不发送的。是的话,才转成相应的鼠标消息发送给当前的进程,这是hook函数才有效。所以造成了hook住的消息只有已经当前进程处理好的鼠标消息(鼠标down后判断的程序的窗口)。而我只想截获mouse event.所以hook可能不对。因为win32的API没有提供对底层event的操作。
    我试过用setcapture.但是它只有在前台窗口才可以capture mouse。
    大家的看法呢?难道只能写driver直接截获mouse event?帮帮我吧。