Пытаясь создать приложение для клавиатуры с сенсорным экраном WPF, не можете получить приложение WPF для отправки ключей в другое окно? Какие-либо предложения? - PullRequest
2 голосов
/ 19 мая 2010

Моя клавиатура с сенсорным экраном имеет настраиваемый интерфейс и имеет все компоненты, которые мне нужны, кроме отправки клавиш, кто-нибудь видит проблемы с этим. Первоначально, когда я создавал его, я собирался использовать Forms.SendKeys.Send (), но это приложение WPF ... не надо. Для начала VB.Net в своей бесконечной мудрости решила, что не будет обрабатывать стандартные формы сообщений. Пойди разберись.

Или, может быть, это моя настоящая проблема, я не могу заставить приложение WPF перестать фокусироваться. Я хочу, чтобы он действовал как сенсорная клавиатура Windows, но каждое действие, которое происходит в прозрачном WPF, делает это приложение активным. Я хочу, чтобы события по-прежнему происходили, но мне нужно, чтобы активное окно было окном, в которое вы хотите печатать, например блокнотом.

Какие-либо предложения о том, что мне следует делать, чтобы сделать мой WPF не фокусируемым и отправить кнопки клавиатуры в сфокусированное (или другое) окно?

PS, я использую WPF в Visual Studio 2010 в Vb.Net (я могу использовать код C # для!)

1 Ответ

3 голосов
/ 20 мая 2010

Я думаю, вы найдете ответ здесь полезно

Есть несколько скомпилированных способов добиться этого, но решение, которое я изложил, заключается в том, что приведенная выше ссылка проста и имеет только одну причуду, и, честно говоря, можно обойти эту проблему. При перетаскивании окна ввода оно не обеспечивает обратную связь до тех пор, пока перемещение не будет завершено, но вы можете обойти это, обработав некоторые не клиентские сообщения, я могу потратить некоторое время на просмотр обходного решения, если вам нужно, но сначала убедитесь, что это решение правильно для вас.

Обновление : пример того, как вышеуказанный подход может быть применен к форме 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);
    }    
  }
}
...