问题标签 [keyboard-hook]
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# - 什么会导致 Windows 取消挂钩低级别(全局)键盘挂钩?
我们通过SetWindowsHookEx
with安装了一些全局键盘挂钩,WH_KEYBOARD_LL
这些挂钩似乎被 Windows 随机取消。
我们验证了它们的钩子不再附加,因为调用UnhookWindowsHookEx
句柄返回false
。(还验证了它true
在正常工作时返回)
似乎没有一致的重现,我听说它们可能会由于超时或抛出异常而脱钩,但我已经尝试过两者都只是让它在处理方法的断点上停留超过一分钟,以及只是抛出一个随机异常(C#),它似乎仍然有效。
在我们的回调中,我们快速发布到另一个线程,所以这可能不是问题。我已经阅读了 Windows 7 中有关在注册表中设置更高超时的解决方案,因为 Windows 7 显然对超时更具侵略性(我们都在这里运行 Win7,所以不确定这是否发生在其他操作系统上),但这并没有这似乎不是一个理想的解决方案。
我考虑过让后台线程运行以每隔一段时间刷新一次钩子,这很骇人听闻,但我不知道这样做有什么真正的负面后果,而且它似乎比更改全局 Windows 注册表设置更好.
还有其他建议或解决方案吗? 设置钩子的类和它们所附加的委托都是静态的,所以它们不应该被 GC 处理。
编辑:通过调用验证GC.Collect();
它们仍然有效,因此它们不会被垃圾收集。
c# - WinForms:如何防止文本框处理 alt 键并失去焦点?
我有这个文本框,用于捕获首选项配置的键盘快捷键。我使用低级键盘挂钩来捕获键并阻止它们执行操作,例如 Windows 键,但 Alt 键仍然通过并使我的文本框失去焦点。
如何阻止 Alt 键,使焦点在我的文本框中保持不变?
python - 在python中生成鼠标-键盘组合事件
我希望能够同时进行按键和鼠标点击的组合,例如Control+LeftClick
目前我可以使用以下代码进行控制,然后左键单击:
它的作用是按下键盘上的控制键,然后单击。我需要它来保持按住控件的时间更长,并在它仍然被按下时返回以继续运行代码。是否有一种可能较低级别的方式来表示按下键,然后在代码中告诉它抬起键,例如鼠标在做什么?
c# - 在 C# 中触发了一个事件之后,我该怎么做?
我正在使用以下项目来处理我的 C# 应用程序中的全局键盘和鼠标挂钩。
这个项目基本上是使用 WH_MOUSE_LL 或 WH_KEYBOARD_LL 常量围绕 Win API 调用 SetWindowsHookEx 的包装器。它还管理某些状态,并且通常使这种挂钩非常轻松。
我将其用于我正在开发的鼠标手势识别软件。基本上,我设置了它,以便它检测何时按下全局热键(比如 CTRL),然后用户以预定义手势的形状移动鼠标,然后释放全局热键。
KeyDown 的事件被处理并告诉我的程序开始记录鼠标位置,直到它收到 KeyUp 事件。这工作正常,它允许用户轻松进入鼠标手势模式。一旦 KeyUp 事件触发并且它检测到适当的手势,就假定将某些击键发送到用户为他们刚刚绘制的特定手势定义的活动窗口。
我正在使用 SendKeys.Send/SendWait 方法将输出发送到当前窗口。
我的问题是:当用户释放他们的全局热键(比如 CTRL)时,它会触发 KeyUp 事件。我的程序获取其记录的鼠标点并检测相关手势并尝试通过 SendKeys 发送正确的输入。
但是,由于所有这些都在 KeyUp 事件中,因此该全局热键尚未完成处理。因此,例如,如果我定义了一个手势以在检测到键“A”时发送它,并且我的全局热键是 CTRL,那么当检测到它时,SendKeys 将发送“A”但 CTRL 仍然是“向下”。所以,我得到的不是仅仅发送 A,而是 CTRL-A。因此,在此示例中,它不是物理发送单个字符“A”,而是通过 CTRL-A 快捷方式选择全部。即使用户释放了 CTRL(全局热键),系统仍然认为它已关闭。
一旦我的 KeyUp 事件触发,我怎样才能让我的程序等待一段时间或某个事件,以便我可以确定全局热键确实不再被系统注册,然后才通过 SendKeys 发送正确的输入?
vb6 - 在任务管理器执行之前捕获 Ctrl+Shift+Esc
我正在使用 Windows API (SetWindowsHookEx) 来捕获键盘事件。我想将 Ctrl+Shift+Esc 组合传递给我的应用程序进行处理,但禁止显示任务管理器。
不幸的是,看起来这三个组合键从来没有达到我的键盘挂钩程序那么远。我只拿到两把钥匙。
我不想全局禁止任务管理器,只是为了我的应用程序。
有没有办法做到这一点?
macos - 您如何在 Mac OS X 中实现全局键盘挂钩?
我知道这可以用于 Windows,XGrabKey
也可以用于 X11,但是 Mac OS X 呢?我想创建一个类,该类允许设置即使在应用程序窗口处于非活动状态时也可以调用的快捷键。
c# - 可以使用 Winkey+L 进行低级键盘挂钩/SendInput 吗?(工作站锁定在 Vista 及更高版本中被拦截)
我从事一个名为UAWKS(非官方 Apple 无线键盘支持)的项目,该项目可帮助 Windows 用户使用 Apple 的蓝牙键盘。UAWKS 的主要目标之一是将Cmd密钥(Winkey在 Windows 中的行为)与交换Ctrl,允许用户执行Cmd+C用于复制,Cmd+T用于新选项卡等。
它目前使用AutoHotkey开发,在 Windows XP 下运行良好。但是,在 Vista 和 Windows 7 上,Cmd+L会导致问题:
- 无论低级键盘钩子如何,Win+L总是被 Windows 拦截并通常锁定工作站...
- 您可以使用此注册表 hack禁用工作站锁定,但按Win+L仍然无法在 AHK 中反弹
- 按Win+L使 Winkey 处于 Keydown 状态,直到下一个(附加)Winkey Up。模拟 Keyup 事件似乎也不起作用!
似乎Win+L是一个特殊的和弦,它把其他一切都搞砸了。
我查看了 AHK 源代码,他们尝试SendKey()
在 keyboard_mouse.cpp 中解决这个问题(在 v1.0.48.05 中的第 883 行附近),但它不起作用。我用 C# 编写了自己的低级键盘挂钩应用程序,我看到了同样的问题。
有没有其他人遇到过这个?有解决方法吗?
winapi - 拦截对窗口的击键
是否可以拦截发送到窗口的击键(和字符)?通过拦截,我的意思是扮演中间人,而不是仅仅钩住窗口。
我想过滤(即消除一些击键)对窗口的击键。
java - Windows 中的 JNA 键盘挂钩
我已经整理了一个 JNA 代码,用于在 Windows 中安装键盘挂钩(使用 JNA 示例)。代码编译完成,我安装了钩子(我成功地处理了钩子),我也可以成功卸载钩子。但是,当我按下键盘上的任何键时,回调永远不会被调用。这是我的代码(大部分是从 JNA 示例中获得的类型定义,我直接转到“main”)
过去,我曾多次使用 C++ 和 C# 完成键盘/鼠标挂钩。这是我第一次尝试使用 Java,我只是不知道我是否正确导入和映射了库。有任何想法吗?
谢谢你。
c# - 检测自动写入器(keboard-hooks)
我需要检测文本输入是否由键盘或某些自动编写器工具(使用键盘钩子模拟键盘的应用程序)处理。你有什么想法还是不可能?谢谢