Вопрос по wpf, c# – Как создать объект KeyEventArgs в WPF (связан с ответом SO)

26

Я нашел этот ответ, который выглядит так, как мне нужно:

Как я могу программно генерировать события нажатия клавиш в 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 я нашел несколько ответов, направленных на этот ответ, но ни один из них не рассматривал, как создать экземпляр в первую очередь.

Как я могу это сделать?

Если кто-то ищет простой и быстрый способ имитации клавиши, нажмите мой ответ на исходный вопрос:stackoverflow.com/a/37029044/2363706 Ravid Goldenberg

Ваш Ответ

5   ответов
9

unit test вы обнаружите, что Keyboard.PrimaryDevice.ActiveSource имеет значение null ... и выдает исключение при попытке его использования.

Пересмешка PresentationSource - это работоспособное решение (требуется sta):

[Test]
[RequiresSTA]
public void test_something()
{
  new KeyEventArgs(
    Keyboard.PrimaryDevice,
    new Mock<PresentationSource>().Object,
    0,
    Key.Back);
}
50

Я нашел это:Keyboard.PrimaryDevice.ActiveSource должен быть использован

InputManager.Current.ProcessInput(
    new KeyEventArgs(Keyboard.PrimaryDevice,
        Keyboard.PrimaryDevice.ActiveSource,
        0, Key.Tab)
    {
       RoutedEvent = Keyboard.KeyDownEvent
    }
);
Почему вы не принимаете свой ответ? Это было довольно полезно;)
-1
var kea = new KeyEventArgs(
    Keyboard.PrimaryDevice,
    new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero),
    0,
    Key.Enter)
    {
        RoutedEvent = UIElement.KeyUpEvent
    };
1

unit test модель представления Мне нужно было использовать омбинацию ответа Осара Риза и Элайджи В. Ганьи, чтобы сделать эту работу.

    [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.

11

System.Windows.Interop.HwndSource, вот так:

var kea = new KeyEventArgs(
    Keyboard.PrimaryDevice, 
    new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero), // dummy source
    0, 
    key);
Очень полезно! Я боролся с этим некоторое время. Спасибо!

Похожие вопросы