【问题标题】:SendKeys.Send Method in WPF applicationWPF 应用程序中的 SendKeys.Send 方法
【发布时间】:2012-07-19 07:41:44
【问题描述】:

我正在尝试发送 Keystroke(Ctrl+T) 以进行浏览器控制。但是,SendKeys.Send() 在 WPF 应用程序中显示错误??我的问题是

1) 我可以在 WPF 应用程序中使用这种方法吗?

2) 是否有任何替代方法来发送自动击键。

谢谢。

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    SendKeys 是 System.Windows.Forms 命名空间的一部分,Wpf 中没有等效的方法。您不能将 SendKeys.Send 与 WPF 一起使用,但如果将 System.Windows.Forms 添加到项目引用中,则可以使用 SendKeys.SendWait 方法。您唯一的其他选择是 PInvoke SendInput

    请注意,这两种方法都将数据发送到当前活动的窗口。

    【讨论】:

    • 感谢您的建议 :-)
    【解决方案2】:

    我发现了一个blog post 描述了InputManager 的使用。它允许您在 WPF 中模拟键盘事件。

    /// <summary>
    ///   Sends the specified key.
    /// </summary>
    /// <param name="key">The key.</param>
    public static void Send(Key key)
    {
      if (Keyboard.PrimaryDevice != null)
      {
        if (Keyboard.PrimaryDevice.ActiveSource != null)
        {
          var e = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, key) 
          {
              RoutedEvent = Keyboard.KeyDownEvent
          };
          InputManager.Current.ProcessInput(e);
    
          // Note: Based on your requirements you may also need to fire events for:
          // RoutedEvent = Keyboard.PreviewKeyDownEvent
          // RoutedEvent = Keyboard.KeyUpEvent
          // RoutedEvent = Keyboard.PreviewKeyUpEvent
        }
      }
    }
    

    【讨论】:

    • 这很好用,但是有没有办法用密钥发送一些修饰符? (例如 Ctrl+V?)也许你可以让 KeyboardDevice 认为修饰键被按下了?谢谢!
    • 仅供参考,这仅将 wpf 应用程序本身中的键事件排入队列,不能用于将击键发送到其他应用程序。
    • 仅供参考-您需要通过 Assembly ref 添加:PresentationCore 和 WindowsBase
    • 我认为这个例子基本上是有缺陷的,因为如果在处理控制键或 alt 键组合时使用它,参数 'Keyboard.PrimaryDevice' 将移交当前按下的修饰键和发送的键.例如,假设您正在处理 Ctrl-I 并想要发送一个“Key.Tab”,您最终将发送 Ctrl-Tab。问题是 .NET 不允许您访问 KeyboardDevice 的修饰符。应该添加一个访问它们的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多