0

TextBox のあるウィンドウがあります。カーソルは TextBox 内にあります。キーを押すと、WndProc でメッセージを受け取ります (KeyUp と KeyDown の場合)。しかし、KeyUp イベントと KeyDown イベントで e.Handled = true を設定すると、キー メッセージを受け取りません。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var textBox = new TextBox();
        textBox.KeyDown += TextBox_KeyDown;
        textBox.KeyUp += TextBox_KeyUp;
        Content = textBox;
        (PresentationSource.FromVisual(this) as HwndSource).AddHook(WndProc);
    }

    private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        e.Handled = true;
    }

    private void TextBox_KeyUp(object sender, KeyEventArgs e)
    {
        e.Handled = true;
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        Debug.WriteLine(msg + " " + wParam);
        return IntPtr.Zero;
    }
}

WndProc で PreviewKeyDown/PreviewKeyUp イベントを受け取ることは可能ですか?

4

2 に答える 2

0

ManagedWinApi を使用してみてください。NuGet でインストールできます。

PM> Install-Package ManagedWinapi

キーボードおよびその他の msg インターセプトの広範な例については、http: //mwinapi.sourceforge.net/を参照してください。

別の代替手段はhttps://easyhook.github.io/です

どちらのライブラリも十分に文書化されています。

于 2015-10-13T13:23:27.890 に答える