问题标签 [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.
winapi - Win32 全局密钥挂钩 / SetWindowsHook / GetAsyncKeyState 有时不起作用
我有一个关于虚拟键挂钩的问题。我想为我的应用程序定义全局快捷方式(RegisterHotkey 不够)。但是,我尝试了两种方法来实现快捷方式:
我注册了一个 WH_KEYBOARD_LL 钩子。我将所有挂钩代码放入一个 DLL 中,它工作正常!但是:当特殊应用程序(例如 CCleaner )具有焦点时,钩子不再起作用!我的申请没有任何结果。我尝试使用 32 位和 64 位 DLL。
我试图通过频繁调用 GetAsyncKeyState 而不是使用钩子来解决问题。此版本也运行良好,直到特殊应用程序(再次 CCleaner)成为焦点。此时 GetAsyncKeyState 为所有键返回 0,即使它们被按下。
有谁知道如何解决这个问题?
顺便说一句,似乎禁用我的钩子的应用程序是用 Delphi 编写的。此外,这些“邪恶”应用程序不会对任何输入做出反应,这意味着对这些应用程序窗口的 ShowWindow 调用没有效果。SetWindowLong 等也是如此。
非常感谢您的回复!
c++builder - 无法在 Borland C++ Builder 中使用 SetWindowsHookEx 和 LowLevelKeyboardProc
我正在开发一个软件,它在运行时必须阻止一些键盘输入。由于我已经谈到了放弃这个愿望的一些问题,所以我不会在这里重复细节(为了更好地了解情况,请阅读以下内容:How can I disable specific Windows hotkeys from inside a software using C++?)
我现在的问题是我能够用 Qt 做我想做的事,现在我必须将它传递给 Borland C++ Builder 6,但是 Builder 的编译器拒绝了代码:
指出
[C++ 错误] FrmMain.cpp(155): E2034 无法将 'long (__stdcall *)(int,unsigned int,long)' 转换为 'int (__stdcall *)()'
这很奇怪,一旦 Qt 发现这行代码没有任何问题并且一切运行正常。问题在于“SetWindowsHookEx”中包含“LowLevelKeyboardProc”。我在代码中尝试了一些更改,但没有成功。
有人可以帮我解决这个问题吗?
谢谢,
莫默吉尔
注意:有关代码的更多详细信息,请访问我发布的链接。
winapi - 本地挂钩不起作用
我有一个应用程序并希望监视MSWord按键(本地挂钩),但我不知道如何找到要使用的 pid!下面的代码在全局钩子 ( pid
= 0
) 和 ( pid
= GetCurrentThreadId
) 下效果很好。但不适用于GetWindowThreadProcessId
:
我会非常非常感谢任何关于这个问题的...
注意:
我希望只对MSWord有一个钩子。
上面的代码有效,仅在尝试挂钩另一个应用程序时失败(即:不使用
pid
=0
或pid
=GetCurrentThreadId
),导致 = "无法安装鼠标挂钩!" .我已经尝试过
FindWindow
,,,,FindWindowEx
; 由于这不起作用,我相信问题是。GetForegroundWindow
GetActiveWindow
GetWindowThreadProcessId
dll - 奇怪的钩子行为 32/64 位
我正在使用(WH_KEYBOARD)
带有 ms word (OpusApp) 的本地挂钩。好吧,据我所知,一个 32 位应用程序32bit DLL
必须只能与32bit target applications
. 奇怪的是该程序仅适用于 64 位应用程序!!!就是这样,只有64bits APPS
!例如,it works with IE 64 but not with IE 32!
该应用程序dll
是 32bit 编译的radstudio XE2
,我将版本确认为 PE 标头。在 32 位操作系统中,应用程序和 dll 不起作用。
我在网上没有找到解决方案,也没有找到解决这个奇怪问题的起点。
DLL 代码:
EXE调用代码:
c++ - 使用 SetWindowsHookEx 的 C++ 仅适用于添加到其中的奇怪 vcl 代码。在 BCB2009
我在使用 SetWindowsHookEx 时遇到了一个奇怪的情况
我有一个 bcb 2009 项目,上面有一个表格和一个备忘录。
在创建中,我们加载 Dll 并将函数处理程序附加到两侧。
这个想法是,当按下键盘时,备忘录框中会出现一条消息,而当鼠标事件发生时,备忘录框中会出现其他文本。
奇怪的是,当我从调试信息中清除代码时,它停止工作。这意味着钩子被触发了一次,然后就结束了。在调试中,我使用了一些 VCL TStringList 将 key stokes 数据记录到磁盘。使用该代码我终于通过添加检测到
[代码]
对于每个钩子函数(键盘、鼠标),代码都可以再次工作。
我必须这样做的代码有什么问题?
这是我 15 年来第一次制作 dll。所以它可以是创建 dll 或导出函数的真正基础。
欢迎提出任何建议。
问候
合资公司
一些新的附加信息:
[已解决]我的目标是嵌入式win XP。我的应用程序创建了一个错误,该错误会通过 Windows 关闭资源管理器。并且该钩子在 xp 中不能全局工作,而只能在本地工作。但它正在我的开发平台上运行 win 7 x64 全局键入和鼠标在记事本中导致应用程序中的消息。[解决] 将WH_KEYBOARD修改为WH_KEYBOARD_LL,鼠标从WH_MOUSE修改为WH_MOUSE_LL,解决了Windows XP嵌入式接收键鼠问题。
dll 和应用程序都没有运行时库或包。
DLL 代码
[代码]
这是应用程序。
[代码cpp]
和表格标题
[代码]
c# - SetWindowsHookEx 失败并出现错误 1428
我尝试通过以下代码连接到开始按钮。
SetWindowHookEx 总是遇到错误 1428 ERROR_HOOK_NEEDS_HMOD
不能在没有模块句柄的情况下设置非本地挂钩。
我无法理解这一点。尽管我在打电话,但它失败了GetModuleHandle(null)
。
c++ - 如何监视我生成的进程中的活动?
我的任务是尝试监视从初始程序生成的所有 GUI 程序中的活动,并在它们在一段时间内不活动时杀死它们。这不可能是系统活动,因为即使用户只是使用另一个程序一段时间(不是由初始程序产生的),我们也必须关闭程序。应用程序生成过程是一个 .Net 程序,不会改变。我可以用来从 .NetSetWindowsHookEx
设置低级挂钩(WH_KEYBOARD_LL
和WH_MOUSE_LL
),但不确定如何将消息与我已启动的进程关联(使用System.Diagnostics.Process
。)我可以从执行挂钩的应用程序中挂钩事件,但它会当我尝试为生成的程序挂钩到特定线程时总是失败。
我最接近的方法是创建一个SetWindowsHookEx
代表 .Net 程序调用的 C++ dll。使用这种方法,我可以连接到生成的 notepad.exe 的第一个线程,但永远不会调用回调函数。如果我指定线程 id 为 0,则在原始应用程序中有活动时调用回调,因此我知道SetWindowsHookEx
在这种情况下的工作原理。
我还没有完全理解挂钩,但是从我所读到的内容来看,这将不起作用,因为 dll 回调函数地址对于被挂钩的进程来说毫无意义。这是我遇到的问题吗?如果是这样,有没有办法解决这个问题,或者有人可以建议一种替代方法来确定是否正在积极使用生成的进程?
.Net (C#) 代码:
C++ DLL:
目前所有这些都是在 32 位 Windows XP 计算机上完成的。我明白需要一个单独的 64 位 dll 来处理生成的 64 位应用程序。
windows - WH_MOUSE_LL 钩子,避免得到无用的 WM_MOUSEMOVE 事件
有没有办法,即使是肮脏的黑客,也可以避免在挂钩中接收WM_MOUSEMOVE
事件?WH_MOUSE_LL
我只对轮子旋转和按钮感兴趣。WM_MOUSEMOVE
在我的场景中,接收的性能成本是不可接受的。
我不能使用WH_MOUSE
.
windows - 如何在Windows上挂钩屏幕的重绘事件(制作中间级别的屏幕)?
我想知道如何将屏幕渲染为中间级别。
也就是说,我可以在每次重新绘制屏幕之后,在屏幕实际显示在监视器上之前生成屏幕 HDC。
比如Window 7的放大镜实用程序。你可以看到放大镜窗口下的内容,它是怎么做出来的?
谢谢 :-)
问候,王泽维尔。
winapi - WH_KEYBOARD_LL 钩子不捕获自己进程中的输入
我正在使用低级键盘挂钩 (WH_KEYBOARD_LL) 来禁用某些输入,例如 Alt-Tab。我在带有消息泵的线程上创建了钩子,因此我可以正确处理通知。
只要我不关注创建钩子的窗口(即我的主窗口),钩子的回调函数就能够处理键盘事件,但是一旦我激活该窗口,钩子中不会出现任何事件,直到我停用再次窗口,输入改为传播到窗口的 WindowProc。
有人知道这里发生了什么吗?
更新:所以,事实证明这种行为是由于在同一进程中注册原始输入引起的。显然,每当我的进程窗口聚焦时,使用原始输入会导致我的低级键盘挂钩被禁用。有谁知道为什么以及如何解决这个问题?