在我的应用程序中,我正在构建一个屏幕键盘,其中各个键是WPF按钮。我想将相应的虚拟键码(对于每个按钮)发送到操作系统。
例如我的应用程序中有一个按钮,内容为“A”。如果我点击它,它应该向操作系统发送虚拟键码'A',并且'A'应该被添加到活动应用程序的聚焦文本框中,就像硬件键盘一样。
我想是否有任何类和方法可供我这样做。我尝试使用SendKeys.SendWait(“{A}”);但它在WPF中不起作用。
答案 0 :(得分:4)
说明我的评论SendKeys.SendWait
将与WPF合作,而SendKeys.Send
则不会。你的一个问题是,如果你试图将A发送到另一个应用程序,你的格式错误,Braces表示它是一个特殊键,字母A不存在。您需要使用SendKeys.SendWait("A")
代替。另一个问题是,如果您将Wpf应用程序用作键盘,则在单击按钮时它是前台应用程序。您将需要深入研究WinApi和Pinvoke的几个函数,即FindWindow
和SetForegroundWindow
。
来自SendKeys.Send上的链接:
由于没有托管方法来激活其他应用程序,您可以在当前应用程序中使用此类,也可以使用本机Windows方法(如FindWindow和SetForegroundWindow)强制关注其他应用程序。
示例显示如何切换到另一个应用程序(我使用记事本作为示例)
public partial class MainWindow : Window
{
[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
SetForegroundWindow(FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad"));
SendKeys.SendWait("A");
}
}