在我的应用程序中,我正在构建一个屏幕键盘,其中各个键是 WPF 按钮。我想将相应的虚拟键码(每个按钮)发送到操作系统。
例如,我的应用程序中有一个按钮,内容为“A”。如果我点击它,它应该向操作系统发送虚拟键码“A”,并且应该将“A”添加到活动应用程序的焦点文本框中,就像硬件键盘一样。
我想有任何可以用来这样做的类和方法。我试过 SendKeys.SendWait("{A}"); 但它在 WPF 中不起作用。
阐述我的评论SendKeys.SendWait
将与 WPF 一起使用,而SendKeys.Send
不会。您的一个问题是,如果您尝试将 A 发送到另一个应用程序,则您的格式错误,大括号表示它是一个特殊键,对于字母 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");
}
}