【问题标题】:Trying to create a WPF Touch Screen Keyboard Appliaction, Can't get WPF App to Send Keys to another window? Any suggestions?尝试创建 WPF 触摸屏键盘应用程序,无法让 WPF 应用程序将键发送到另一个窗口?有什么建议?
【发布时间】:2011-02-21 13:42:42
【问题描述】:

我的触摸屏键盘是高度可定制的界面,除了发送键外,我需要的所有组件都有,任何人都可以看到这个问题。最初当我创建它时,我打算使用 Forms.SendKeys.Send() 但它是一个 WPF 应用程序......不行。对于初学者来说,VB.Net 以其无限的智慧决定它不会处理默认表单消息。去图吧。

或者,这是我真正的问题,我无法让 WPF 应用程序停止获取焦点。我希望它像 Windows 触摸键盘一样工作,但是透明 WPF 中发生的每个操作都会使该应用程序成为活动应用程序。我希望事件仍然发生,但我需要活动窗口是您希望输入的窗口,例如记事本。

关于我应该做什么,使我的 WPF 不可聚焦并将键盘按钮发送到聚焦(或其他)窗口的任何建议?

PS,我在 Vb.Net 的 Visual Studio 2010 中使用 WPF(我可以使用 C# 代码!)

【问题讨论】:

    标签: c# wpf vb.net sendkeys multitouch-keyboard


    【解决方案1】:

    我想你会发现答案here很有用

    有许多复杂的方法可以实现这一点,但我提出的解决方案是上面的链接很简单,只有一个怪癖,老实说可以解决。拖动输入窗口时,在移动完成之前它不会提供反馈,但是您可以通过处理一些非客户端消息来解决此问题,如果您需要,我可以花一些时间查看解决方法,但首先确认此解决方案是正确的给你。

    更新:如何将上述方法应用于 WPF 表单的示例。

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Interop;
    using System.Runtime.InteropServices;
    
    namespace WpfApplication1
    {
      /// <summary>
      /// Interaction logic for Window1.xaml
      /// </summary>
      public partial class Window1 : Window
      {
        public Window1()
        {
          InitializeComponent();
        }
    
        const int WS_EX_NOACTIVATE = 0x08000000;
        const int GWL_EXSTYLE = -20;
    
        [DllImport("user32", SetLastError = true)]
        private extern static int GetWindowLong(IntPtr hwnd, int nIndex);
    
        [DllImport("user32", SetLastError = true)]
        private extern static int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewValue);
    
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
          WindowInteropHelper wih = new WindowInteropHelper(this);
          int exstyle = GetWindowLong(wih.Handle, GWL_EXSTYLE);
          exstyle |= WS_EX_NOACTIVATE;
          SetWindowLong(wih.Handle, GWL_EXSTYLE, exstyle);
        }    
      }
    }
    

    【讨论】:

    • 这正是我要尝试的,它在 Windows 窗体环境中运行良好。事实上,我正在考虑回到 Windows 窗体,但在 WPF 中 CreateParams 覆盖不存在。因为它的类型是 System.Windows.Window 而不是 System.Windows.Forms.Form。如果我不想使用新的表示层,我的生活会轻松很多。它比 windows 窗体更挑剔......但它是未来。
    • @Justin,您仍然可以将相同的主体应用于 WPF。您只需要在创建后设置样式。我会尽快发布一个快速示例。
    • 我已经对其进行了调整,它工作正常,它允许在使用动作时将焦点重新转移到另一个窗口上。谢谢,这解决了我的许多问题之一。现在我只需要让它将键盘按键动作发送到另一个窗口。我试过 SendKeys() 没有运气,我尝试使用 user32 dll 来获取要发送的密钥,没有运气。我正在使用这个例子:pinvoke.net/default.aspx/user32/SendInput.html 有什么想法吗?我会继续努力,但是,我在这里画一个空白。
    • @Justin,当我实现了我用 SendKeys.SendWait 测试的示例并且它对我有用时,你尝试过吗?
    • 我会尝试发送等待看看有什么作用,现在我的窗口没有设置为焦点,我会看看它是否顺利。
    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2013-06-07
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多