【问题标题】:Example of hooking a window?挂钩窗户的例子?
【发布时间】:2011-07-29 10:54:48
【问题描述】:

我想hook另一个程序的窗口,这样就可以得到光标进入窗口的时间。怎么做?我知道它与 SetWindowsHookEx 一起使用,但我找不到示例(甚至是本地示例)。我在 C#2.0 中执行此操作,但如果有办法,我可以使用本机 dll。挂钩 WM_PAINT 或一些循环方法也可以完成这项工作。

【问题讨论】:

    标签: .net winapi c#-2.0 hook


    【解决方案1】:

    您可能希望在 WM_NCHITTEST 上设置一个挂钩,每当鼠标移到窗口上时就会发送该挂钩。您只需要获取窗口句柄,然后使用 WH_CALLWNDPROC 调用 SetWindowsHookEx。您的 CallWndProc 挂钩应如下所示:

    LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam ) {
      if( nCode < 0 ) {
        return CallNextHookEx( NULL, nCode, wParam, lParam );
      }
    
      CWPSTRUCT* pCWP = ( CWPSTRUCT* )lParam;
    
      switch( pCWP -> message ) {
      case WM_NCHITTEST: {
        ...
        return CallNextHookEx( NULL, nCode, wParam, lParam );
      }
      default:
        return CallNextHookEx( NULL, nCode, wParam, lParam );
      }
    }
    

    您也可以使用 WH_MOUSE 尝试 SetWindowsHookEx。

    【讨论】:

    • 谢谢,但我在哪里可以找到完整的示例?也可以直接在C#中吗?
    • 本地操作的文档在这里非常好:msdn.microsoft.com/en-us/library/ms644960(v=vs.85).aspx。我有相当多的经验,所以如果你有一个具体的问题,我可能会回答。不幸的是我不做 C# :)
    • 很好,但是这个例子不包含完整的源代码。
    • 为什么不呢?您所需要的只是带有钩子过程的模块,然后调用 SetWindowsHookEx() ,所有这些都记录在该页面上。
    • 顺便说一句,为什么不使用 TrackMouseEvent ?
    【解决方案2】:

    无需使用 SetWindowsHookEx。你可以通过subclassing它来勾住窗口。

    如果你想为每个窗口安装这个钩子,那么你可能想重新考虑这个方法,但无论如何,EnumWindows 仍然可以正常工作。

    【讨论】:

    • 我猜在那种情况下,你可以注入一个DLL?
    • 然后防病毒软件会像病毒一样检测到它。
    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多