我目前正在进行覆盖,它将自身附加到不同的进程窗口,并允许通过wpf文本框输入文本。
我通过调用windows SetWindowLong函数来实现这一点,以便在顶部绘制UserControl并防止它被激活。后者是不必从主窗口窃取焦点,叠加层应用于:
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);
[DllImport("user32.dll")]
static extern int GetWindowLong(IntPtr hwnd, int index);
这样称呼:
var extendedStyle = GetWindowLong(hwnd, GwlExstyle);
SetWindowLong(hwnd, GwlExstyle, extendedStyle | 0x00000008 | 0x08000000);
这种方法的问题是文本框不能像往常一样使用。我设法使用global key hooks拦截键盘输入,这是正常工作,但将cuaght键插入textBox证明是困难的。
我尝试使用textBox.RaiseEvent(),使用适当的密钥引发KeyDown事件,但它不会导致非活动窗口上的任何输入。
public void SimulateKeypress(Key k)
{
textBox.Focus();
Keyboard.Focus(textBox);
textBox.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(textBox), 0, k)
{ RoutedEvent = Keyboard.PreviewKeyDownEvent });
}
另一方面,使用TextInputEvent我可以输入文本,但这不允许我方便地标记和删除文本。
public void SimulateKeypress(Key k)
{
Focus();
Keyboard.Focus(textBox);
textBox.RaiseEvent(new TextCompositionEventArgs(InputManager.Current.PrimaryKeyboardDevice, new TextComposition(InputManager.Current, textBox, "This works"))
{ RoutedEvent = TextCompositionManager.TextInputEvent });
}
到目前为止,重新创建textBox功能(输入,删除和标记文本,ctrl + c等)似乎是唯一可行的选项。虽然这确实是可能的,但它看起来并不优雅。如果可能的话,这是一个我想避免的选项。
任何想法如何允许在非活动textBox上输入?