C# WPF中的按键模拟

C# WPF中的按键模拟,c#,.net,wpf,input,touch,C#,.net,Wpf,Input,Touch,我正在为WPF touch应用程序开发一个屏幕numpad。这将出现在弹出窗口中。当按下一个按钮时,它应该向应用程序发送一个击键,使其看起来像是用户在文本框中键入的内容。这是我的代码: // 'key' is set beforehand InputManager.Current.ProcessInput(new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, Environment.TickCo

我正在为WPF touch应用程序开发一个屏幕numpad。这将出现在
弹出窗口中
。当按下一个按钮时,它应该向应用程序发送一个击键,使其看起来像是用户在
文本框中键入的内容。这是我的代码:

// 'key' is set beforehand
InputManager.Current.ProcessInput(new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, Environment.TickCount, key) { RoutedEvent = Control.KeyDownEvent });
这在
按钮中调用。单击事件处理程序

到目前为止,只有
Key.Back
有效。所有的数字键都不起作用,
Key.Decimal

编辑:我认为使用
SendKeys
可以解决这个问题,但它的作用是一样的

为什么我的数字按钮不起作用?我已验证是否传递了正确的
键。

查看。WPF文本框在处理某些键时出现问题

从文章中:

var eventArgs = new TextCompositionEventArgs(Keyboard.PrimaryDevice, 
new TextComposition(InputManager.Current, Keyboard.FocusedElement, key));  
eventArgs.RoutedEvent = TextInputEvent;  

InputManager.Current.ProcessInput(eventArgs); 

在我们的评论之后,我建议你考虑这样的方法。我不知道完整的需求,但将功能分解并使应用程序不那么单一始终是一个好方法

首先,伪UML图如下所示:

您的三个函数将实现如下(伪代码):


要进一步解耦UserControl2和UserControl1,正如我提到的,您可以使用事件模式,如.NET事件或EventAggregator

数字键盘上的键可能与第一行的键不同。这是一个未经测试的注释-不是答案。@BalamBalam:最上面的一行和numpad键都不能使用代码。两者都在物理键盘上工作。这听起来像是实现某种目标的迂回方式。您能否在第三方助手类中实现所有按键功能,并获得弹出式键盘或键盘来输入这些功能?@Dr.AndrewBurnett-Thompson:我没有特殊的按键处理。只是一个
TextBox
。好的,为什么不在弹出键上单击“TextBox.Text+=newKeyCharacter”?如果弹出控件没有底层控件的引用来设置文本,则使用事件模式(如.NET events或EventAggregator)将数据从弹出控件获取到文本框
TextComposition
构造函数希望最后一个参数为字符串,非
键变量应替换为所需的键,例如,Tab键的Key.Tab谢谢您的回答。我仍然在寻找一种只需按下一个键的方法,但如果我找不到,我会接受。我确信有一种方法,我会研究UIAutomation框架,因为它可以模拟鼠标/键输入(主要用于自动化测试)。然而,我想指出的一点是,如果可能的话,最好避免这种情况,并将逻辑从视图交互中移出,移到代码隐藏中的特定函数中,或者更好地移到MVVM应用程序中的ViewModels中
UserControl1.InsertCharacter(string character)
{
    textBox1.Text = textBox1.Text.Insert(textBox1.CaretIndex, character); 
    this.ValidateInput();
}

UserControl1.ValidateInput()
{
    // Perform validation
}

UserControl1.OnKeyDown()
{
    // Perform validation
    this.ValidateInput();
}

UserControl2.AppendCharacter(string clickedCharacter)
{
    this.userControl1.InsertCharacter(clickedCharacter); 
}