问题标签 [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.
c# - SetWindowsHookEx WH_KEYBOARD_LL 没有收到事件
我正在使用 SetWindowsHookEx() 创建键盘挂钩。创建似乎成功,但注册的过程永远不会被调用。有什么我做错了吗?
=
=
=
c++ - 无法为进程中的所有线程安装挂钩
我在应用程序中连接键盘。要求是在进程中的所有线程中挂钩键盘。
我使用了 SetWindowsHookEx API
钩子是为进程中的所有线程创建的。这工作正常,直到调用线程存在。一旦调用线程终止钩子停止工作。
有没有办法挂钩进程而不是进程中的线程。
c# - C# 中的 SetWindowsHookEx
我正在尝试挂钩第 3 方应用程序,以便我可以在其屏幕上绘图。在屏幕上绘图很容易,我不需要帮助,但我似乎在使用SetWindowsHookEx
to 处理WH_GETMESSAGE
. 我不知道最后两个参数要传递什么。
c++ - C++ SetWindowsHookEx WH_KEYBOARD_LL 正确设置
我正在创建一个控制台应用程序,我想在其中记录按键(如向上箭头)。我创建了一个低级键盘挂钩,它应该捕获任何线程中的所有按键并调用我的回调函数,但它不起作用。当我按下一个键时,程序会暂停一段时间,但从不调用回调。我检查了文档,但没有找到任何东西。我不知道我是否错误地使用了 SetWindowsHookEx()(据我所知,它成功创建了钩子)还是我的回调函数不正确!我不确定有什么问题!在此先感谢您的帮助。
.net - 在 VS2008 调试器中调用 SetWindowsHookEx 总是返回 NULL
我们正在开发一个执行低级键盘挂钩的.Net 应用程序。当我们调用在调试器中运行的 SetWindowsHookEx 时,调用总是失败。
从已编译的可执行文件运行时,一切正常。如果我们附加到已调用 SetWindowsHookEx 的进程,则一切正常。
我在某处(我不记得)读到 VS 已经做了一个低级键盘钩子,但这应该不是问题,因为有 CallNextHook 函数。
有人知道发生了什么吗?
编辑:代码非常简单,异常是在调试器内部引发的,而不是在外部引发的。
c# - 什么会导致 Windows 取消挂钩低级别(全局)键盘挂钩?
我们通过SetWindowsHookEx
with安装了一些全局键盘挂钩,WH_KEYBOARD_LL
这些挂钩似乎被 Windows 随机取消。
我们验证了它们的钩子不再附加,因为调用UnhookWindowsHookEx
句柄返回false
。(还验证了它true
在正常工作时返回)
似乎没有一致的重现,我听说它们可能会由于超时或抛出异常而脱钩,但我已经尝试过两者都只是让它在处理方法的断点上停留超过一分钟,以及只是抛出一个随机异常(C#),它似乎仍然有效。
在我们的回调中,我们快速发布到另一个线程,所以这可能不是问题。我已经阅读了 Windows 7 中有关在注册表中设置更高超时的解决方案,因为 Windows 7 显然对超时更具侵略性(我们都在这里运行 Win7,所以不确定这是否发生在其他操作系统上),但这并没有这似乎不是一个理想的解决方案。
我考虑过让后台线程运行以每隔一段时间刷新一次钩子,这很骇人听闻,但我不知道这样做有什么真正的负面后果,而且它似乎比更改全局 Windows 注册表设置更好.
还有其他建议或解决方案吗? 设置钩子的类和它们所附加的委托都是静态的,所以它们不应该被 GC 处理。
编辑:通过调用验证GC.Collect();
它们仍然有效,因此它们不会被垃圾收集。
c# - 未找到模块
我一直在研究这个问题,但还没有接近解决方案。
我再次挖出了 WindowsHookLib 的旧副本 - 它的源代码位于http://www.codeproject.com/KB/DLL/WindowsHookLib.aspx。这个库允许全局 Windows 鼠标/键盘/剪贴板挂钩,这非常有用。
我正在尝试使用此处的鼠标钩来捕获鼠标运动(我可以使用始终轮询 Cursor.Position 的计时器,但我计划稍后使用 WindowsHookLib 的更多功能)。
代码如下:
但是在调用 InstallHook() 时,我得到一个异常:“找不到指定的模块”。奇怪的。搜索时,我发现有人认为发生这种情况是因为 DLL 不在 Windows PATH 变量中包含的位置,并且因为将其放在 system32 中并没有帮助我全力以赴并将其翻译成 C# 以直接包含在我的项目(我很好奇它是如何工作的)。
然而错误是顽固地持续存在,所以我对此进行了一些研究,并在库中找到了负责的代码:在 InstallHook() 中,我们有
这(在修改和重新编译之后)告诉我,我真正得到的是一个 Windows 错误“ERROR_MOD_NOT_FOUND”!现在,我被难住了。我不是直接把 Hook Library 编译到我的项目中了吗?
(UnsafeMethods.SetWindowsHookEx 只是来自 user32 的 DllImported 方法)
非常感谢任何答案,或正确方向的刺激,或任何提示,指针或类似的东西!
c++ - 在我的代码完成运行之前,如何防止事件被传递到 GUI?
我安装了一个全局鼠标钩子函数,如下所示:
钩子函数如下所示:
现在,我的问题是我无法控制“做有趣的事情”部分究竟需要多长时间。特别是,它可能需要比 Windows 注册表中定义的 LowLevelHooksTimeout 更长的时间。这意味着,至少在 Windows XP 上,系统不再将鼠标事件传递给我的钩子函数。我想避免这种情况,但同时我需要在目标 GUI 接收事件之前发生“做有趣的事情”部分。
我试图通过在一个单独的线程中做“有趣的东西”工作来解决这个问题,这样mouseEventHookFn
上面就可以向工作线程发布一条消息,然后return 1;
立即执行一个(这会结束钩子函数但避免将事件传递给 GUI )。这个想法是工作线程在完成后CallNextHookEx
自己执行调用。
但是,这会导致内部崩溃CallNextHookEx
(实际上,崩溃发生在名为 的内部函数内部PhkNextValid
。我认为从挂钩函数外部调用是不安全的CallNextHookEx
,这是真的吗?
如果是这样,是否有其他人知道我如何在 GUI 接收事件之前运行代码(需要与应用程序的 GUI 线程交互)并避免我的钩子函数阻塞太久?
windows - 使用 SetWindowsHookEx 的进程范围挂钩
我需要将一个 dll 注入一个或多个外部进程,我还想从中拦截键盘事件。这就是为什么使用带有 WH_KEYBOARD 的 SetWindowsHookEx 看起来是一个简单的方法来一步实现这两个目标。
现在,当我只对几个选定的进程感兴趣时,我真的不想安装全局挂钩,但 Windows 挂钩似乎是全局的或仅限线程的。
我现在的问题是如何正确设置流程范围的挂钩。
我想一种方法是在我的应用程序的目标进程的主线程上设置钩子,然后在我的 dll 中对所有其他正在运行的线程执行相同的操作(加上 DLL_THREAD_ATTACH 用于稍后启动的线程)。但这真的是一个好方法吗?更重要的是,没有更简单的方法来设置进程范围的钩子吗?我的想法看起来既麻烦又丑陋,但是我无法在任何地方找到有关执行此操作的任何信息。
multithreading - 在我的线程上下文中调用“SetWindowsHookEx”函数
为了SetWindowsHookEx
在 GUI 应用程序中使用,您通常希望在发生事件时在线程中调用一个函数。
因此,例如,如果我正在制作一个软件来显示系统上所有被按下的键,我希望我的 GUI 应用程序以某种方式AddKeyToList(int vkeycode)
在按下某个键时调用该函数。
我不是 Windows 内部的专家,但如果我正确理解了文档,则安装的钩子SetWindowsHookEx
会在导致它们钩子的事件的线程上下文中被调用。因此,为了做到我所描述的,需要:
创建一个包含钩子函数的 DLL,并在那里创建一个共享内存区域,所有线程将通过它共享和相互通信。
pInvoke
在钩子函数和 GUI 程序中创建类似的机制。在我们的示例中,钩子函数会将按下的键发送到我们的 GUI 程序,GUI 程序将在其自己的上下文中调用该AddKeyToList
函数。
这对于一个相对简单的类来说是非常复杂的(与 unix 世界中的 XRecord 扩展相比),如果你使用类似Qt
.
是否有任何库(最好是开源的)已经实现了这些机制,并使我能够使用“外观”,例如,每当发生 a时,它将在我的线程上下文中WH_KEYBOARD_LL
调用一个函数?
我的分析是否正确,还是有更简单的方法来实现我所描述的?
Qt
图书馆可以帮我完成这项任务吗?