【问题标题】:WPF : Send KeyCode to Active ApplicationWPF:将 KeyCode 发送到活动应用程序
【发布时间】:2013-07-29 06:37:35
【问题描述】:

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

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

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

【问题讨论】:

  • SendKeys.SendWait 应该可以工作,您如何将焦点更改为您尝试向其发送输入的应用程序,您的 WPF 键盘将在您单击某个键时成为活动应用程序。

标签: .net wpf


【解决方案1】:

解释我的评论 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");
    }
}

【讨论】:

  • 我同意重新定位/聚焦窗口 - 但是为什么同步调用而不是异步调用有什么不同呢?另外,我不确定它是如何由股票窗口屏幕键盘实现的,但它似乎以某种方式避免了焦点,但仍然保持在最上面。我不确定它是否在每个键后切换焦点或有一些有趣的窗口标志?
  • @Basic 不幸的是 Wpf 不支持发送方法,您可以使用其他较低级别的方法,例如 WinApi 的 PostMessageSendMessage
  • @Mark Hall - 感谢您的帖子。我还有一个问题。如果我希望键盘嵌入到应用程序中并使用键盘向这种情况发送键码,我应该采取什么方法。现在,如果我尝试在同一个应用程序的文本框中使用键盘,那么在我单击按钮后,文本框失去焦点并且没有反映。请帮忙。
  • 添加到我之前的评论中,如何在触发点击事件时找到焦点元素并保持焦点。我想这是这个问题的根源。
  • @user2185985 如果您在同一个应用程序中使用键盘,您将能够处理您的输入并将其发送到适当的元素。如果您希望使您的 WPF 应用程序能够处理来自 SendKeys 的输入,您将需要向其添加一个 WinProc,如本文所示 zamjad.wordpress.com/2009/09/10/…。如果您尝试在另一个程序上查找特定元素,则需要使用 Spy 并使用 FindwindoxEx 确定元素的窗口名称。
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2014-02-15
  • 2012-07-25
  • 2017-01-08
相关资源
最近更新 更多