2

在我的应用程序中,我正在构建一个屏幕键盘,其中各个键是 WPF 按钮。我想将相应的虚拟键码(每个按钮)发送到操作系统。

例如,我的应用程序中有一个按钮,内容为“A”。如果我点击它,它应该向操作系统发送虚拟键码“A”,并且应该将“A”添加到活动应用程序的焦点文本框中,就像硬件键盘一样。

我想有任何可以用来这样做的类和方法。我试过 SendKeys.SendWait("{A}"); 但它在 WPF 中不起作用。

4

1 回答 1

4

阐述我的评论SendKeys.SendWait将与 WPF 一起使用,而SendKeys.Send不会。您的一个问题是,如果您尝试将 A 发送到另一个应用程序,则您的格式错误,大括号表示它是一个特殊键,对于字母 A 不存在。你需要SendKeys.SendWait("A")改用。另一个问题是,如果您将 Wpf 应用程序用作键盘,那么在您单击按钮时它就是前台应用程序。您将需要深入研究 WinApi 和 Pinvoke 的几个函数,即FindWindowSetForegroundWindow.

从 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");
    }
}
于 2013-07-29T07:11:18.953 回答