30

我发现这个答案看起来像我需要的:

如何以编程方式在 C# 中生成按键事件?

除了我不能创建一个实例KeyEventArgs(我不知道怎么做)

有问题的代码是:

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

  target.RaiseEvent(
    new KeyEventArgs(
      Keyboard.PrimaryDevice,
      PresentationSource.FromVisual(target), //<--- HERE, I can't
      0,
      key)
    { RoutedEvent=routedEvent }
  );

编译器说:

The best overloaded method match for
'System.Windows.PresentationSource.FromDependencyObject(System.Windows.DependencyObject)'
 has some invalid arguments

ide 说:

参数类型IInputElement不可分配给参数类型DependencyObject

在 StackOverflow 中,我找到了几个针对该答案的答案,但没有一个解决了如何首先创建实例的问题。

我怎样才能做到这一点?

4

5 回答 5

58

呸呸呸

我找到了:Keyboard.PrimaryDevice.ActiveSource必须使用

InputManager.Current.ProcessInput(
    new KeyEventArgs(Keyboard.PrimaryDevice,
        Keyboard.PrimaryDevice.ActiveSource,
        0, Key.Tab)
    {
       RoutedEvent = Keyboard.KeyDownEvent
    }
);
于 2012-05-30T17:25:26.363 回答
17

与 Bill Tarbell 的回答类似,您还可以创建一个虚拟System.Windows.Interop.HwndSource,如下所示:

var kea = new KeyEventArgs(
    Keyboard.PrimaryDevice, 
    new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero), // dummy source
    0, 
    key);
于 2015-03-14T21:56:45.207 回答
12

如果有人试图创建 KeyEventArgs 以用于单元测试,您会发现 Keyboard.PrimaryDevice.ActiveSource 为 null .. 并在您尝试使用它时引发异常。

模拟 PresentationSource 是一个可行的解决方案(需要 sta):

[Test]
[RequiresSTA]
public void test_something()
{
  new KeyEventArgs(
    Keyboard.PrimaryDevice,
    new Mock<PresentationSource>().Object,
    0,
    Key.Back);
}
于 2014-03-27T07:02:13.733 回答
1

要对视图模型进行单元测试,我必须结合使用 OscarRyz 和 Elijah W. Gagne 的答案来完成这项工作。

    [TestMethod]
    public void method_event_expected()
    {
        this.objectUnderTest.TestMethod(
            new KeyEventArgs(Keyboard.PrimaryDevice, new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero), 0, Key.Oem3)
            {
                RoutedEvent = Keyboard.KeyDownEvent
            });

        Assert.IsTrue(...)
    }

Keyboard.PrimaryDevice.ActiveSource 是空的,所以我不得不用一个虚拟窗口来伪造它,然后我还需要分配 RoutedEvent。

于 2015-12-18T11:38:58.477 回答
-3
var kea = new KeyEventArgs(
    Keyboard.PrimaryDevice,
    new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero),
    0,
    Key.Enter)
    {
        RoutedEvent = UIElement.KeyUpEvent
    };
于 2017-06-28T00:11:59.327 回答