如何防止包含全局转换的热键干扰Windows

时间:2016-04-03 17:56:35

标签: c# .net windows winforms sendkeys

摘要

如何通过从另一个人调用System.Windows.Forms.SendKeys.Send(“abc”)来阻止作为全局热键的一部分的shift键在向Windows中的活动窗口发送文本时发生干扰包含班次的全局热键被激活时的处理?

问题

激活热键时激活的窗口误解了发送到的文本,因为Shift键是热键的一部分,在接收和处理发送给它的文本时仍然按下。人工不可能足够快地释放移位键,因此在收到文本时仍然没有按下它。 无法将热键更改为不包含shift ,即使可能,ctrl-key也会以类似的方式干扰处理。 发送应用程序作为普通用户运行,没有管理员权限,并启用了UAC。

  • 在Windows中运行后台应用程序。它是一个普通的.NET C#WinForm应用程序,由用户启动并在没有可见GUI的情况下运行。
  • 后台应用程序已注册一个全局热键,即可以在Windows中的任何位置按下的热键,无论当前哪个应用程序处于活动状态。
  • 热键是:<shift>+F9RegisterHotKey(hWnd, hotkeyId, 4/*MOD_SHIFT*/, 120 /*Keys.F9*/);
  • 激活热键后,后台应用程序将调用System.Windows.Forms.SendKeys.Send("abc")
  • 活动窗口接收文本“abc”,但由于仍然按下热键的shift键,结果最终为“ABC”。

问题

在接收窗口获取,处理和解释之后,有哪些方法可以确保发送的文本最终结束? 也就是说,当通过按<shift>+F9向正在运行的notepad.exe实例发送“abc”时,显示在记事本中的文本应该是“abc”而不是“ABC”。

1 个答案:

答案 0 :(得分:1)

据我所知,

  1. 检查Shift修改器状态,仅在确认未按下后发送密钥
  2. 不要使用SendKeys
  3. 我认为#1非常自我解释,但请记住,即使您在开始发送密钥之前确认没有按下Shift,也可能在发送密钥时用户仍然可以按Shift或其他修改器或者甚至更糟糕的是活动窗口失去焦点并完全停止它的可能性。如果您正在设计一个程序,只需在热键按下后插入用户定义的文本并且用户期望它,那么这不是什么大问题,并且是适合这种情况的方法。

    您有#2的几个选项,我建议使用SendMessageAn apropriate message(WM_CHAR,WM_SETTEXT,WM_KEYDOWN等)直接向窗口发送消息有问题。

    说完一切之后,重要的是要意识到这是一个非常不确定的过程。您永远不能保证模拟键盘输入或发送密钥消息将按照您的意愿进行注册,这可能在很大程度上取决于您发送消息的应用程序(特别是在SendMessage的情况下)。