C# WPF中的按键模拟
我正在为WPF touch应用程序开发一个屏幕numpad。这将出现在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
弹出窗口中
。当按下一个按钮时,它应该向应用程序发送一个击键,使其看起来像是用户在文本框中键入的内容。这是我的代码:
// '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);
}