所以,我想出了如何做到这一点。我有一个名为的类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 方法的实现,我不必在用户控件类中使用键盘管理器实例并连接事件来监听它们。另外,因为我已经收集了所有设备对象(鼠标和键盘),并且它们维护一个字段,说明每个设备的当前焦点元素是什么,并且我已经配对了每个鼠标和键盘设备,所以我可以直接使用它引发事件的信息。