0

我正在尝试在 WPF 中构建一个应用程序,我想在其中处理来自连接到单台计算机的多个键盘的输入(KeyPress 事件)。所以,我有一个类,我覆盖WndProc()方法并能够接收来自不同键盘设备的输入。在执行此操作时,我使用 MainWindow 句柄注册此类,因此窗口可以接收 CLR 键盘事件。但这不是问题。

问题是现在我正在开发UserControlWPF,它也可以响应这些多键盘事件。这些UserControls将在同一个窗口中实例化,但我正在考虑发送事件(尤其是RoutedEvents通过接口发送事件(尤其是 as )。因此,我的自定义 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 回答