【问题标题】:Trigger a keyboard key press event without pressing the key from keyboard触发键盘按键事件而不按键盘上的键
【发布时间】:2013-03-12 13:49:03
【问题描述】:

如何在不按键盘按键的情况下触发按键事件?我尝试了here 的解决方案,但出现以下异常:

最好的重载方法匹配 'System.Windows.PresentationSource.FromVisual(System.Windows.Media.Visual)' 有一些无效的参数。

考虑 Shift+A 包含来自键盘的 2 个按键事件,我如何在不按下键盘的情况下做到这一点?(让,只需在按钮单击的文本框中打印大写 A)

我的代码

var key = Key.A;                    // Key to send
var target = Keyboard.FocusedElement;    // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send

target.RaiseEvent(new System.Windows.Input.KeyEventArgs(Keyboard.PrimaryDevice, System.Windows.PresentationSource.FromVisual(target), 0, key) { RoutedEvent = routedEvent });

【问题讨论】:

  • 您是否尝试过链接中的 sendkeys 示例?
  • @RandomUs1r,是的,我试过了,但是需要一个目标来发送该密钥。如果一个表单中有 10 个文本框,那么标准应该是什么?我想在有电流的地方写 A我在上面的代码中使用了 Keyboard.FocusedElement 的焦点。你知道吗?
  • 我会改用 focusmanager 类:msdn.microsoft.com/en-us/library/…。不过,在更高的层次上,我可能会尝试在 jQuery 中实现类似的东西。
  • @RandomUs1r jQuery... 在 WPF?!?

标签: c# wpf keyboard-events


【解决方案1】:

System.Windows.Forms.SendKeys.Send() 帮我解决了问题。

有关高级说明和可用代码列表,请咨询the docs for the method。

例如,发送 Shift+A 我使用了SendKeys.Send("+(a)")。

【讨论】:

    【解决方案2】:

    你需要投到Visual:

    var key = Key.A;                    // Key to send
    var target = Keyboard.FocusedElement;    // Target element
    var routedEvent = Keyboard.KeyDownEvent; // Event to send
    
    target.RaiseEvent(new System.Windows.Input.KeyEventArgs(Keyboard.PrimaryDevice,
     System.Windows.PresentationSource.FromVisual((Visual)target), 0, key) { RoutedEvent = routedEvent });
    

    您还可以指定您的目标是一个特定的文本框,例如:

    var target = textBox1;    // Target element
    

    代码的实际作用是触发特定元素的 keydown 事件。所以有一个 keydown 处理程序是有意义的:

    private void textBox1_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
    
    }
    

    【讨论】:

    • 但是在尝试上述代码时出现新异常,值不能为空。参数名称:v ...
    • 我将此代码放入按钮单击事件中(这是一个问题吗?)。完全例外是我提到的。
    • @ridoy 我也有它在一个按钮单击,但我没有使用这一行var target = Keyboard.FocusedElement; 因为焦点元素将是按钮,您需要将目标指定为您的名称文本框。例如:var target = YourTextBox;
    • 我明白了,感谢您指出错误。但我需要在任何情况下都这样做,而不是针对单个文本框。假设,我在一个表单中有 10 个文本框,那么标准应该是什么?
    • 可以设置按钮Focusable="False"。您可以使用var target = Keyboard.FocusedElement; 这样即使您单击按钮,文本框也会聚焦。
    【解决方案3】:

    模拟键盘事件的简单可靠的方法是使用keybd_event api

    你可以参考这里

    http://www.pinvoke.net/default.aspx/user32.keybd_event

    这里有更多的文章

    http://www.codeproject.com/Articles/7305/Keyboard-Events-Simulation-using-keybd_event-funct

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多