【发布时间】:2010-05-26 16:40:32
【问题描述】:
我的应用程序使用SendInput 在其他应用程序中合成击键。这几乎可以工作,除了由于我无法更改的情况,发送输入时左 Windows 键将始终被物理按下。这意味着,例如,如果发送的击键是“d”键,则 Windows 会将击键视为其 Win+D 快捷方式并显示桌面,而“d”击键永远不会到达其预期目标。
文档中提到了这个问题,但令人沮丧的是如何解决这个问题(强调我的):
此函数不会重置键盘的当前状态。调用该函数时已按下的任何键都可能会干扰该函数生成的事件。为避免此问题,请使用
GetAsyncKeyState函数检查键盘的状态并根据需要更正。
我应该如何“根据需要更正”?
我尝试使用SetKeyboardState 关闭VK_LWIN 键的键盘状态,首先将我的线程附加到我将击键发送到的窗口线程(使用AttachThreadInput),但是这似乎根本不会影响行为。
我还尝试在使用SendInput 发送的输入的开头插入KEYEVENTF_KEYUP 事件,但这会导致开始菜单弹出并获取焦点,这显然是不可接受的。
在调用 SendInput 时处理按下的 Windows 徽标键的正确方法是什么?
编辑:
根据@Brian's answer,我可以通过安装一个捕获win-key keydown 事件的低级keyhook 来防止win 键干扰我的代码。
但是,这会产生不希望的效果,即 Windows 键现在已完全禁用。我可以设想一些解决方案,我记下我的 keyhook 中所有键的状态,并在按下其他键时模拟 windows 键的按下,这取决于它们是否是我的键模拟,但这对我来说听起来像是一个黑客。或者,我可以使用我的 keyhook 来模拟重要的 Windows 键盘快捷键。
但是文档暗示它应该以更直接的方式工作。 Brian 的解决方案是首先防止 win 键进入按下状态。但是文档指出您应该能够检查它是否被按下,如果是则更正它。
真的可以做到吗?
【问题讨论】:
-
我喜欢把我郁闷的钥匙拿出来吃冰淇淋,这通常会让他们感觉更好。