0

1台のコンピューターに接続された複数のキーボードからの入力(KeyPressイベント)を処理したいWPFでアプリケーションを構築しようとしています。したがって、WndProc()メソッドをオーバーライドして、さまざまなキーボードデバイスから入力を受け取ることができる単一のクラスがあります。これを実行している間、このクラスをMainWindowハンドルに登録すると、ウィンドウはCLRキーボードイベントを受信できるようになります。しかし、これは問題ではありません。

問題は、UserControlこれらのマルチキーボードイベントにも応答できるWPFで開発していることです。これらは同じウィンドウでインスタンス化されますが、インターフェイスを介してUserControls(特にとして)イベントを送信することを考えていました。RoutedEventsそのため、カスタムUserControlクラスはインターフェイスを実装するだけで、準備は完了です。

これを行う方法を知っていますか。私はWPFを初めて使用するため、問題が発生しています。

前もって感謝します !!!

4

1 に答える 1

0

それで、私はこれを行う方法を考え出しました。BIFUserControl同じコンピューターに接続された複数のキーボードからのイベントを処理するために作成したインターフェイスを実装するというクラスがあります。インターフェイスはと呼ばれIMultiKeyboardEventsます。BIFKeyboardDeviceまた、各キーボードデバイスの現在の状態をクラスのインスタンスとして格納する読み取り専用のコレクションもあります。

BIFKeyboardDeviceしたがって、基本的には、クラスのプロパティとして表される、各キーボードデバイスの入力フォーカスが何であるかを知っています。したがって、キーボードマネージャークラスからCLRイベントを発生させる場合BIFKeyboardManager、特定のコントロールへの入力フォーカスを持つ正確なクラスでインターフェイスメソッドの実装を実際に呼び出すことができます。

IMultiKeyboardEventsカスタムユーザーコントロールクラスによって実装されるインターフェイスのコードは次のとおりです。

public interface IMultiKeyboardEvents  
{
    event MultiKeyEventHandler MultiKeyDown;
    event MultiKeyEventHandler MultiKeyUp;

    void OnMultiKeyDown(MultiKeyEventArgs);
    void OnMultiKeyDown(MultiKeyEventArgs);
}

また、 WndProc()メソッドをオーバーライドするキーボードマネージャークラスには、次のような入力イベントを処理するメソッドがあります。

void ProcessInput(Message message)
{
    // Code sample which raises just the key down event
    switch (rawInput.keyboard.Message)
    {
        case (uint) BIFWin32.WindowMessage.WM_KEYDOWN:
        {
            if (BIFDeviceCollections.MouseCollection[ID].MouseFocusElement is IMultiKeyboardEvents)
            {
                IMultiKeyboardEvents widget = 
                (IMultiKeyboardEvent)BIFDeviceCollections.MouseCollection[ID].MouseFocusedElement;
                widget.OnMultiKeyDown(eventArgs);
            }
            break;
        }
        case (uint) BIFWin32.WindowMessage.WM_KEYUP:
        {
            if (BIFDeviceCollections.MouseCollection[ID].MouseFocusElement is IMultiKeyboardEvents)
            {
                IMultiKeyboardEvents widget = 
                (IMultiKeyboardEvent)BIFDeviceCollections.MouseCollection[ID].MouseFocusedElement;
                widget.OnMultiKeyUp(eventArgs);
            }
            break;
        }
    }
}

これは、 UserControlクラスのOnMultiKeyDownメソッドの実装を呼び出すだけであり、ユーザーコントロールクラスのキーボードマネージャーインスタンスを使用してイベントをフックし、それらをリッスンする必要はありません。また、すべてのデバイスオブジェクト(マウスとキーボード)のコレクションがすでにあり、各デバイスの現在のフォーカス要素を示すフィールドが保持されているため、各マウスとキーボードデバイスをペアリングしているため、これを直接使用できます。イベントを発生させるための情報。

于 2012-07-18T08:12:43.890 に答える