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