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

アイデアは次のように述べています。

引数の型IInputElementはパラメーターの型に割り当てられませんDependencyObject

そして、StackOverflow全体で、その回答に向けられたいくつかの回答を見つけましたが、最初にインスタンスを作成する方法に対処するものはありません。

どうやってやるの?

4

5 に答える 5

58

ふぅwww

私はそれを見つけました: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 は null だったので、ダミー ウィンドウでそれを偽造する必要があり、次に RoutedEvent を割り当てる必要もありました。

于 2015-12-18T11:38:58.477 に答える