全局的鼠标钩子,也可以简单的用SetCapture

解决方案 »

  1.   

    感觉QQ的截屏是一个透明窗口
    你按截屏,然后按WIN键
      

  2.   

    为什么会有这个想法,并不是因为我手头需要这个功能,只是最近很多帖子都提到了提取屏幕上某点颜色的问题,取出颜色已解决了。但我想顺便做出一个屏幕取色的简单工具软件。
    具体的要求是,点击一个“开始取色”按钮后,安装钩子以完全锁住鼠标,其他程序不能响应鼠标消息。然后鼠标移动到屏幕上某处单击后,就刷新一下该软件主窗口的某个颜色区域,以正确反映所取到的颜色,如果觉得满意了,就单击另一个“停止取色”按钮后释放已钩子停止取色。我设置了钩子函数,而且也已经基本按照上述意图正确的运行了,但只能取到本窗口上的颜色。其他窗口均能响应鼠标消息(包括本软件一同打开的 Console 窗口也能响应)。我安装的钩子是线程钩子,而不是系统钩子,不知道是不是这个原因,导致不能进行全局截取鼠标消息。
    不幸的是,我不知道如何安装全局钩子。
    以下是 MSDN 中有关帮助文档。HHOOK SetWindowsHookEx(
        int idHook,
        HOOKPROC lpfn,
        HINSTANCE hMod,
        DWORD dwThreadId
    );lpfn
    [in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process. hMod
    [in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process. dwThreadId
    [in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread. For a specified hook type, thread hooks are called first, then global hooks. The global hooks are a shared resource, and installing one affects all applications in the same desktop as the calling thread. All global hook functions must be in libraries. Global hooks should be restricted to special-purpose applications or to use as a development aid during application debugging. Libraries that no longer need a hook should remove its hook procedure. 鼠标钩子可以作为线程钩子安装,也可作为全局钩子安装,但上一段中描述的安装全局钩子的方法,我不知道 .net 中如何来实现。
    也就是说,现在的问题已经仅是如何在 .net 中安装鼠标的全局钩子了。希望各位大侠指教。一旦解决,我立即将此工具软件源代码公布在我的 BLOG 上,blog.csdn.net/ahbian
      

  3.   

    [DllImport("user32.dll", EntryPoint="SetWindowsHookEx")]
    public static extern int SetWindowsHookEx (
    int idHook,
    int lpfn,
    int hmod,
    int dwThreadId
    );
      

  4.   

    全局钩子的第四个参数肯定是 0,然而必须符合以下条件:
           All global hook functions must be in libraries. 问题是相关的 lpfn 和 hMod 如何获取和设定?
      

  5.   

    最简单的,弄个全屏的100%透明的Form,盖住
      

  6.   

    最简单的,弄个全屏的100%透明的Form,盖住
    ————
    这个办法好,呵呵
    生成一个全屏并且topmost的窗体,直接把窗体的背景设置成截屏的图片就可以了,连设置透明都省了,还方便取色
      

  7.   

    .BackColor = Color.White
    .FormBorderStyle = FormBorderStyle.None
    .WindowState = FormWindowState.Maximized
    .Opacity = 0.01哇哇哇
      

  8.   

    速马的方法够绝,但其他程序还是可以响应鼠标消息,这会导致取色操作时的混乱,做出来的效果绝对不专业。而且,简单使用 this.Capture = true 这一句就足以做出这样的效果了。this.Capture = true 这个方式下,可以将其他窗口调到前台来。这正是我不满意并且随后诉诸于鼠标钩子的原因。Terry 提到 TopMost 有点接近了,但一个系统中可以设置 TopMost 的窗口不是唯一的,所以不能保证这个透明窗口就一定始终保持在最前台。两位提出的建议开了一下我的眼界。的确不必钻在钩子这个死胡同里。
    但 .NET 中设置全局钩子的技术还是值得控讨的。
    希望大侠们快来啊。
      

  9.   

    .TopMost=true;
    .FormBorderStyle=FormBorderStyle.None;
    .WindowState=FormWindowState.Maximized;
    .BackgroundImage=截取的屏幕图片就可以了,不会点到下面的窗体,而且后面的取色和区域选择都很方便
      

  10.   

    user32.dll 中有一个未公开的方法: BlockInput,听起来很酷,但不知道如何用。
    如果把本程序中的 Input 也 Block 掉了,可不大妙了。现在暂且不管屏幕截图和取色的事件,我只是想知道的是 .NET 中如何设置全局钩子。
    只要全局钩子解决,不仅解决了屏幕的问题,而且其他的软件功能就都也想像了。3721 那么招人厌,而且看起来似乎使用了什么密技,其实说到底,3721 不过就是用好了全局钩子和 Shell 调用这两块功能而已,没什么大不了的。我们掌握这个技术,并不是为了要像 3721 那么惹人厌。(不过 3721 最近在这方面改进不少了)
      

  11.   

    我的代码测试过没得问题啊,不会点到下面的窗体
    只是Opacity应该设置为0.01而不是0Terry的思路更进一步,目前最佳 :-)
    谁想个更好的?
      

  12.   

    http://blog.joycode.com/mvm/archive/2004/10/18/35790.aspx终于找到了一个有价值的好帖,看来可以解决了。
    但将 WH_MOUSE 改为 WH_MOUSE_LL,等于放弃 win9x/nt4 平台了。还是有点不妥。昨晚为什么就没找到呢?看来搜索的关键词以及其顺序对搜索结果的影响实在太大了。
      

  13.   

    用全局钩子(WH_MOUSE_LL)后,所捕获的消息的确是全局,但由此带来一个问题:所有鼠标消息相关的 hWnd 都是 0(的确此时也没有那个句柄可与消息相关联)。这样一来,原来根据消息关联句柄判断是否在“停止取色”按钮上的代码就无效了。后来,我只能采用键盘判断方式来停止取色,就是按下 Esc 键就停止取色。由于软件做得自己都不是很满意,再加上已经浪费了我一天多时间,所以暂时不公布在 BLOG 上了。等过一段时间有空再说了。关于钩子使用的源代码,下帖中可以找到很多相关的链接:
    http://blog.joycode.com/mvm/archive/2004/10/18/35790.aspx关于屏幕取色的源代码,可以参考此帖:
    http://community.csdn.net/Expert/topic/3515/3515381.xml?temp=.6530268以上也就算是一个临时的答复吧。