我正在使用以下项目来处理我的 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 发送正确的输入?