输入非活动TextBox

时间:2017-01-05 16:27:04

标签: c# wpf textbox overlay

我目前正在进行覆盖,它将自身附加到不同的进程窗口,并允许通过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上输入?

0 个答案:

没有答案