编程语言
首页 > 编程语言> > 在C#中触发事件后,我该怎么办?

在C#中触发事件后,我该怎么办?

作者:互联网

我正在使用以下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仍为“向下”.因此,我得到的不仅仅是CTRL-A,而不仅仅是发送A.因此,在此示例中,不是物理发送单个字符“ A”,而是通过CTRL-A快捷键全选.即使用户释放了CTRL(全局热键),系统仍然认为它已关闭.

触发KeyUp事件后,如何让程序等待一段时间或某个事件,这样才能确保系统不再真正注册全局热键,然后才通过SendKeys发送正确的输入?

解决方法:

您可以简单地设置一个计时器,并在不到一秒钟的时间(例如100毫秒)内触发SendKeys,用户不会注意到轻微的延迟,但是它足以在KeyUp的事件处理程序之外发生.

另一种选择是在您自己的窗口中发布(使用PostMessage)自定义消息,以发出何时触发效果的信号,并在该自定义消息处理程序中实际执行SendKeys的操作.这具有不使用某些任意“延迟”的优点.但是,设置起来要稍微复杂一些(特别是在.NET中,您必须P /调用更多API调用才能使其正常工作,覆盖WndProc函数,等等.)

标签:keyboard-hook,c
来源: https://codeday.me/bug/20191210/2099151.html