我正在尝试在WPF中构建一个应用程序,我想从连接到一台计算机的多个键盘处理输入(KeyPress事件)。所以,我有一个类,我覆盖 WndProc()方法,并能够从不同的键盘设备接收输入。在执行此操作时,我使用MainWindow句柄注册此类,因此窗口可以接收CLR键盘事件。但这不是问题。
问题是,现在我在WPF中开发UserControl
,它也可以响应这些多键盘事件。这些UserControls
将在同一窗口中实例化,但我正在考虑通过接口发送事件(尤其是RoutedEvents
)。所以,我的自定义UserControl类只是实现了界面,我很高兴。
你们有任何想法如何做到这一点,我是WPF的新手,所以我遇到了一些困难。
提前致谢!!!
答案 0 :(得分:0)
所以,我想出了如何做到这一点。我有一个名为BIFUserControl
的类,它实现了我创建的接口,用于处理连接到同一台计算机的多个键盘的事件。该接口称为IMultiKeyboardEvents
。我还有一个只读集合,它将每个键盘设备的当前状态存储为BIFKeyboardDevice
类的实例。
所以,基本上我知道每个键盘设备的输入焦点是什么,它在BIFKeyboardDevice
类中表示为属性。因此,当从键盘管理器类BIFKeyboardManager
引发CLR事件时,我实际上可以在具有输入焦点的特定控件中调用接口方法实现。
以下是自定义用户控件类实现的接口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方法的实现,我不必使用用户控件类中的键盘管理器实例并挂钩事件来监听它们。此外,因为我已经收集了所有设备对象(鼠标和键盘),并且他们维护了一个字段,说明每个设备的当前焦点元素是什么,并且我已经配对了每个鼠标和键盘设备,所以我可以直接使用它提出事件的信息。