gpt4 book ai didi

c# - 在 C# 中触发事件后,我如何做某事?

转载 作者:行者123 更新时间:2023-11-30 16:34:00 24 4
gpt4 key购买 nike

我正在使用以下 project在我的 C# 应用程序中处理全局键盘和鼠标 Hook 。

该项目基本上是使用 WH_MOUSE_LL 或 WH_KEYBOARD_LL 常量围绕 Win API 调用 SetWindowsHookEx 的包装器。它还管理特定状态,并且通常使这种 Hook 非常轻松。

我将其用于我正在开发的鼠标手势识别软件。基本上,我对其进行了设置,因此它会检测何时按下全局热键(比如 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?

最佳答案

您可以简单地设置一个计时器并在几分之一秒后(比如 100 毫秒)触发 SendKeys,用户不会注意到轻微的延迟,但它发生在事件处理程序之外就足够了KeyUp。

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

关于c# - 在 C# 中触发事件后,我如何做某事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2755576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com