通过WPF中的接口引发键盘事件

时间:2012-07-12 12:06:34

标签: c# wpf routed-events

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

问题是,现在我在WPF中开发UserControl,它也可以响应这些多键盘事件。这些UserControls将在同一窗口中实例化,但我正在考虑通过接口发送事件(尤其是RoutedEvents)。所以,我的自定义UserControl类只是实现了界面,我很高兴。

你们有任何想法如何做到这一点,我是WPF的新手,所以我遇到了一些困难。

提前致谢!!!

1 个答案:

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