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