【发布时间】:2011-02-14 21:10:45
【问题描述】:
我正在使用以下project 来处理我的 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?
【问题讨论】:
标签: c# keyboard-hook