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

2

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

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

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

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

Теги:
wpf
sendkeys

1 ответ

3
Лучший ответ

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

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

Обновить. Пример того, как описанный выше подход можно применить к форме 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);
    }    
  }
}
  • 0
    Это именно то, что я собирался попробовать, это хорошо работает в среде форм Windows. На самом деле я думаю вернуться к форме Windows, но в WPF переопределение CreateParams не существует. Так как его тип System.Windows.Window вместо System.Windows.Forms.Form. Моя жизнь была бы намного проще, если бы я не хотел использовать новый уровень представления. Это намного более привередливый, чем форма окна ... но это будущее.
  • 0
    @Justin, вы можете применить тот же принципал к WPF. Вам просто нужно установить стиль после создания. Я скоро опубликую быстрый образец.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню