Пытаясь создать приложение для клавиатуры с сенсорным экраном WPF, не можете получить приложение WPF для отправки ключей в другое окно? Какие-либо предложения?
Моя клавиатура с сенсорным экраном имеет настраиваемый интерфейс и имеет все компоненты, которые мне нужны, за исключением отправки клавиш, кто-нибудь видит проблемы с этим. Первоначально, когда я создавал его, я собирался использовать Forms.SendKeys.Send(), но это приложение WPF... не надо. Для начала VB.Net в своей бесконечной мудрости решила, что не будет обрабатывать стандартные формы сообщений. Пойди разберись.
Или, может быть, это моя настоящая проблема, я не могу заставить приложение WPF перестать фокусироваться. Я хочу, чтобы он действовал как сенсорная клавиатура Windows, но каждое действие, которое происходит в прозрачном WPF, делает это приложение активным. Я хочу, чтобы события по-прежнему происходили, но мне нужно, чтобы активное окно было окном, в которое вы хотите печатать, например блокнотом.
Есть предложения о том, что мне следует сделать, чтобы сделать мой WPF не фокусируемым и отправить кнопки клавиатуры в сфокусированное (или другое) окно?
PS Я использую WPF в Visual Studio 2010 в Vb.Net (я могу использовать код C# для!)
1 ответ
Я думаю, что вы найдете ответ здесь полезным
Есть несколько компилированных способов добиться этого, но решение, которое я поставил, состоит в том, что приведенная выше ссылка проста и имеет только одну причуду, и, честно говоря, можно обойти эту проблему. При перетаскивании окна ввода оно не обеспечивает обратную связь до тех пор, пока перемещение не будет завершено, но вы можете обойти это, обработав некоторые не клиентские сообщения, я могу потратить некоторое время на просмотр обходного решения, если вам нужно, но сначала убедитесь, что это решение правильно для тебя.
Обновление: пример того, как вышеуказанный подход может быть применен к форме 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);
}
}
}