【问题标题】:how to Install global mouse Hook for certain UI like "desktop"如何为某些 UI(如“桌面”)安装全局鼠标 Hook
【发布时间】:2015-07-13 01:50:15
【问题描述】:

到目前为止的代码安装了一个钩子来检测鼠标活动,但我想要的是过滤某些 UI 的活动或以准确检测点击发生的位置(在哪个 hwnd 上)' 桌面' 有办法吗?

这是我使用的代码,来自 Microsoft 网站 这里:How to set a Windows hook in Visual C# .NET

编辑:我发现他提供的代码不是全局的,所以对于答案中的全局钩子检查链接,,,

【问题讨论】:

  • 您几乎必须先了解 HWND,然后在全局回调期间进行自己的过滤。使用GetDesktopWindow ()提前获取桌面的HWND
  • 谢谢@Micky 的回复我已经考虑过使用'GetDesktioWindow()' 来获取HWND,但是在全局回调期间我可以在哪里或如何过滤它?“首先我尝试使用'WndProc()',但我发现它只接收传递给我正在使用的 HWND 的消息,而与桌面无关“
  • 不用担心,按照示例安装一个 WH_MOUSE,HWND 将通过您的 MouseHook() 回调的 LPARAM 位于 MOUSEHOOKSTRUCT.hwnd 中
  • 我发现这个钩子不是全局的,只能在使用它的表单中工作,这对我来说太令人沮丧了,我应该编辑这个问题吗?我必须从零开始调用 WH_MOUSE_LL 而不是 WH_MOUSE
  • 也许是.NET的限制?由你决定。我总是从 c/c++ 做全局钩子。祝你好运

标签: c# hook mouse-hook


【解决方案1】:

首先关于钩子,我发现它不是全局的,我发现了开源全局钩子Here,所以每当鼠标点击发生时,就会触发一个事件,我会运行简单的回调代码来检查桌面是否是活动控件

[DllImport("user32.dll")]
static extern int GetForegroundWindow();

[DllImport("user32.dll")]
static extern int GetClassName(int hWnd, StringBuilder lpClassName, int nMaxCount);

public void GetActiveWindow() {
const int maxChars = 256;
int handle = 0;
StringBuilder className = new StringBuilder(maxChars);

handle = GetForegroundWindow();

if (GetClassName(handle, className, maxChars) > 0) {
    string cName = className.ToString();
    if (cName == "Progman" || cName == "WorkerW") {
        // desktop is active
    } else {
        // desktop is not active
    }
}

}

完成!

特别感谢 Micky Duncaand 和 AJKenny84

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 1970-01-01
    • 2023-03-10
    • 2021-04-13
    • 1970-01-01
    • 2022-01-07
    • 2014-08-29
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多