如何以编程方式检查键盘是否连接?

5
我正在使用C# WinForms开发一个应用程序。
我们的应用程序将安装在Win8 Surface(触摸屏设备)上。
我们希望检查是否通过USB连接了键盘,如果是,则我们的应用程序不会显示软键盘,否则它将显示软键盘。
有许多方法可用于检查WinRT,但没有适用于WinForms C#的方法。
请告诉我如果我的问题不清楚。
提前致谢。

@CallumLinington 我们尝试过这个方法,但它只显示了机器注册的键盘列表,并没有提供键盘是否连接的事件。谢谢。 - 2intor
这些问题似乎是相关的 https://dev59.com/CWLVa4cB1Zd3GeqPtR0F http://stackoverflow.com/questions/11993680/detect-keyboard-presence-in-windows-8-desktop-program - Codor
可能有关系,但我正在使用C#。 - 2intor
2
我猜你最终将不得不使用P/Invoke。 - Codor
部分离题,但Surface的默认键盘不通过USB连接。 - Sayse
2个回答

7

我刚刚写了这个并在W8上进行了测试:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select Name from Win32_Keyboard");

        foreach(ManagementObject keyboard in searcher.Get())
        {
            if (!keyboard.GetPropertyValue("Name").Equals(""))
            {
                Console.WriteLine("KB Name: {0}", keyboard.GetPropertyValue("Name"));
            }
        }

我连接了第二个键盘并成功检测到。当我拔掉一个键盘时,会有一个条目显示;当我拔掉两个键盘时,就没有任何显示了。
我在这里找到了一些示例:示例1示例2
希望这能帮到你。

有没有办法获得键盘连接/断开的事件? - 2intor
1
这真的有效吗?据我所知,Windows 8平板电脑始终会被注册为只有1个键盘,无论它们是否具有物理键盘(至少Surface 3是如此),或者我误解了什么? - Snellface
@Snellface,我通过检查USB值解决了这个问题。请看我的答案。 - user8128167
蓝牙键盘会像物理键盘一样出现吗?还是像旧的总线连接键盘?我们真的需要一种方法来确定是否存在物理键盘或仅有虚拟键盘。 - Garr Godfrey

4

要确定设备是否通过USB连接,请检查以下字符串:

private readonly string USB = "USB";

    private bool GetKeyboardPresent()
    {
        bool keyboardPresent = false;
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from Win32_Keyboard");

        foreach (ManagementObject keyboard in searcher.Get())
        {
            foreach (PropertyData prop in keyboard.Properties)
            {
                if (Convert.ToString(prop.Value).Contains(USB))
                {
                    keyboardPresent = true;
                    break;
                }
            }      
        }

        return keyboardPresent;
    }

或者,您也可以尝试使用以下 Powershell 命令:

PS C:\Users\myUserID> Get-WmiObject Win32_Keyboard

这对于内置键盘的笔记本电脑如何工作? - DotNet Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接