问题标签 [setwindowshookex]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
9910 浏览

delphi - Windows 全局键盘挂钩 - Delphi

我使用互联网上的源代码创建了一个 GLOBAL 键盘挂钩 DLL。最好的部分是它工作得很好,除了浏览器。

它会拾取浏览器中的每个键,但似乎当浏览器获得焦点时,它会松开按下的第一个键。在 IE 和 Firefox 中对此进行了测试,两者似乎都相同。

例如,如果我打开 IE 并开始输入 www。,我只回来了ww。如果浏览器窗口保持焦点,则不会丢失更多键。一旦浏览器失去焦点并重新获得焦点,第一个键就会再次丢失。

可能是因为只使用 WH_KEYDOWN 而不是 WH_KEYPRESS / WH_KEYUP ?任何人都可以对此有所了解吗?

谢谢

PS:钩子函数本身如下:向DLL发送一个备忘录框和应用程序句柄,DLL将发送消息以及用户消息。

0 投票
2 回答
4617 浏览

winapi - 解除全局 CBT 挂钩后从所有进程中卸载 DLL

当加载它们的系统范围的钩子被卸载时,如何从所有进程中正确卸载 DLL?

来自MSDN

您可以使用 UnhookWindowsHookEx 释放全局挂钩过程,但该函数不会释放包含挂钩过程的 DLL。这是因为全局挂钩过程在桌面中每个应用程序的进程上下文中被调用,从而导致对所有这些进程的 LoadLibrary 函数的隐式调用。由于无法为另一个进程调用 FreeLibrary 函数,因此无法释放 DLL。在显式链接到 DLL 的所有进程都已终止或调用 FreeLibrary 并且调用挂钩过程的所有进程都已恢复 DLL 外部的处理后,系统最终会释放 DLL。

所以我正在寻找的是一种检测钩子何时脱钩的方法,然后FreeLibrary从所有被钩子的进程中调用。卸载钩子时,是否有任何其他方法可以立即卸载 DLL?

0 投票
1 回答
2682 浏览

windows - 如何在 Vista 中使用 SetWindowsHookEx 并将管理应用程序与 UAC 挂钩?

我试图弄清楚是否有一种方法可以使用 SetWindowsHookEx 并能够影响在 Vista 上以管理员权限运行并启用 UAC 的应用程序。这是一个需要向其他窗口的标题栏添加一个小按钮以启用一些多显示器感知处理的应用程序。我原以为这无法做到,但我见过一个似乎可以做到这一点的应用程序。据我所知,其他应用程序没有以管理员权限运行,但它会影响系统中的所有应用程序,包括具有管理员权限的应用程序。

那么,似乎有办法做到这一点,但我不知道如何做到这一点。我的应用程序只需要能够在窗口标题栏上绘图并能够影响它们的移动和大小。我不需要做任何其他事情。

0 投票
1 回答
1794 浏览

delphi - SetWindowsHookEx WH_MOUSE 在 Win7 中的断点处冻结

赫洛斯,

在 WinXP 上,我的应用程序已成功使用全局鼠标钩来检索鼠标位置和点击,即使它没有焦点。钩子在一个单独的 .dll 中,并且正在像这样初始化(在 delphi 中):

现在在 Win7 上,这基本上也可以在运行时工作,但我不能再很好地调试我的应用程序(我可以在 XP 下)。一旦我遇到断点,Win7 就会完全冻结。我无法切换到另一个进程(即使任务管理器无法打开)。如果我很幸运,我可以在 IDE 中停止我的进程。大多数时候,虽然我必须重新启动/注销才能重新获得访问权限。

我知道问题与鼠标钩有关,因为如果我不使用鼠标钩,它就不存在。即使我的钩子程序只执行以下操作,这也是如此:

IE。只是钩子的存在引起了麻烦。

让 globalhooks.dll 向 EventLog 中写入一些内容,我发现它仍然处于活动状态,即使我在断点上也是如此。

我尝试通过 WH_MOUSE_LL 使用低级鼠标钩子,它基本上可以工作,但在安装钩子时给我奇怪的鼠标移动延迟,有时在调整窗口大小时。遇到断点时也会冻结几秒钟,但至少系统会在大约 5 秒后恢复……因此,这个选项更糟糕,因为它也会影响运行时。

知道为什么 WH_MOUSE 钩子首先会在调试期间冻结我的应用程序吗?

0 投票
2 回答
679 浏览

windows - 检测应用程序窗口

我使用CBT Windows Hook来检测窗口创建/删除/最小最大/移动大小事件。

我工作得很好,但我需要过滤来自普通小部件的事件。实际上,我只需要通过 CBT 挂钩通知用户认为窗口的那些窗口。

我面临的问题让我很生气,因为即使我按以下方式过滤窗口,我也会不断收到虚假事件:

这些虚假事件来自阴影效果、菜单和屏幕上显示的所有内容。

是否有一种强大的方法可以从其子项中过滤出真实的窗口?

我避免测试WS_BORDER或类似的测试,因为某些应用程序可以创建没有边框的主窗口......还是我错了?

0 投票
4 回答
9696 浏览

c#-4.0 - 在 32 位机器上为 .NET 4.0 框架编译时,SetWindowsHookEx 返回 0

我正在尝试设置一个低级别的 Windows 键盘挂钩来抓取三个按下的键,即使应用程序不在焦点上也是如此。为此,我将 SetWindowsHookEx 称为

这曾经在使用 .NET Framework 3.5 的 32 位和 64 位机器上工作,但在升级到 .NET Framework 4.0 后停止在 32 位机器上工作。

有谁知道如何解决这个问题,以便我可以使用 4.0 框架并使其在 32 位和 64 位机器上工作?

0 投票
1 回答
1553 浏览

windows-7 - 在 Win7 上,如何在没有 UAC 提示的情况下通过 GUI 设置全局挂钩?

我想通过 SetWindowsHookEx 设置一个全局挂钩。钩子包裹在 hook.dll 中,并由 GUI 窗口 app.exe 注册。在 Windows NT/xp 上一切正常。但是在Win7上,如何在没有UAC提示的情况下启动app.exe进程并且​​它可以成功加载hook.dll以在Win7上注册gloal hook?我用的是VC2005。

任何想法表示赞赏!

最好的愿望,凯文

0 投票
3 回答
5341 浏览

.net-3.5 - SetWindowsHookEx 在 32 位机器上的 .NET 4.0 中以“找不到模块”失败?

我在此页面上发现了类似的问题,但我似乎无法弄清楚如何解释答案或弄清楚它们是否真的重复。

以下是我发现的可能重复项,并附有评论:

汉斯·帕桑特(Hans Passant)对已删除的最后一个答案的评论如下:

您使用的是 .NET 4.0 吗?它的 CLR 改变了程序集的加载方式,不再有 LoadLibrary 调用,也不会有它们的模块句柄。改用 GetEntryAssembly() 将是另一种解决方法。– Hans Passant 5 月 5 日 19:43

那么,这里的词是什么?您使用的是 .NET 4.0 吗?您是否尝试使用 LoadLibrary("user32.dll") 来获取可用的 DLL 句柄?– Hans Passant 5 月 6 日 15:43

我很确定我不需要这样做,但显然我不是 100% 确定。如果我需要更改它,我留下的问题是为什么它在编译为 64 位操作系统时可以在 64 位操作系统上运行Any CPU,但在任何配置中都不能在 32 位操作系统上运行。

如果在加载 .NET 程序集方面确实发生了一些变化,以至于我无法正确处理类库,那么我有以下问题:

  • 有什么办法可以欺骗它做我想做的事,而不必降级到 .NET 3.5 或将钩子库更改为非托管?
  • 为什么在 64 位操作系统上运行时它可以工作,但在 32 位操作系统上却不行?

背景

我在 .NET 4.0 中构建了一个程序,它使用带有 WH_KEYBOARD_LL 钩子类型的 SetWindowsHookEx 来捕获按键。这在我的 64 位 Windows 7 上运行良好,但在 32 位 Windows 7 上安装键盘挂钩时会因“找不到模块”而崩溃。

这是我尝试过的:

  • 为 x86 编译,在 64 位操作系统上运行,因“找不到模块”而崩溃
  • 为 x86 编译,在 32 位操作系统上运行,崩溃
  • 为任何 CPU 编译,在 64 位操作系统上运行,运行良好
  • 为任何 CPU 编译,在 32 位操作系统上运行,崩溃
  • 切换到.NET 3.5,重复以上四种情况,都行

我宁愿不将我的代码切换到 .NET 3.5,因为我正在使用我的一些类库来简化工作,而最新的代码仅在 .NET 4.0 中。

如果需要,您可以下载包含所有内容的 .ZIP 文件作为 Visual Studio 2010 项目,也可以粘贴以下两个文件。

如果你想沿着这条路线重新创建:

  1. 创建一个新的控制台项目,.NET 4.0
  2. 添加另一个类库项目,也是 .NET 4.0
  3. 从控制台程序项目中添加对类库项目的引用
  4. 将下面的 Program.cs 内容粘贴到控制台项目中的 Program.cs 文件中
  5. 将下面的 Hook.cs 内容粘贴到类库项目中的文件中。您可以将其粘贴到 Class1.cs 默认文件中,或添加另一个文件。你不能把它放到控制台项目中

然后编译运行,测试各种配置。

程序.cs

钩子.cs

0 投票
3 回答
4870 浏览

c# - SetWindowsHookEx 在 C# 中似乎对我不起作用(WH_KEYBOARD_LL,全局)

每当用户按下窗口中的某些键时,我的应用程序应该执行一些操作。

SetWindowsHookEx使用选项调用WH_KEYBOARD_LL似乎是实现这一目标的标准方法。但是,在我的情况下,某些事情显然是错误的,并且没有触发回调。

我的调试控制台应用程序的主要方法:

GetCurrentModuleHandle 方法:

user32.dll从和进口kernel32.dll

你知道我是什么问题吗?

0 投票
4 回答
1396 浏览

windows - 有没有办法让 Windows 64 位应用程序在 64 位和 32 位仿真层下执行代码?

我很感兴趣是否可以编写一个应用程序,它能够在没有仿真层的情况下调用一些代码以及在 32 位仿真层内部调用一些代码。

主要原因是我需要使用 API SetWindowHook 并且我想为 64 位和 32 位应用程序设置挂钩。

当然,我可以创建 2 个应用程序(一个用于 32 位,另一个用于 64 位)并同时启动它们。但是,我需要更多代码来管理它们(启动、停止、升级等)。

所以,我正在研究是否有可能拥有一个应用程序。

我唯一的想法是拥有一个应用程序和 2 个 COM DLL(32 位和 64 位)并使用代理进程来运行 32 位代码。但是,它将需要一些额外的 COM 包装器等。