【问题标题】:Programmatically detect if Mouse and Keyboard are plugged in以编程方式检测鼠标和键盘是否已插入
【发布时间】:2015-12-29 16:15:11
【问题描述】:
我想知道检测鼠标或键盘是否插入计算机的最佳方法是什么?我有一个主要用于独立触摸屏的应用程序,但我想知道是否插入了键盘,不要触发拉起 Windows 键盘或包含数字键盘的表单。如果没有插入鼠标,则更改一些行为。
【问题讨论】:
-
我从来没有尝试过这样做,但this 可能有用,也许您可以使用它来查找鼠标/键盘。不过不确定。
标签:
vb.net
windows
keyboard
mouse
【解决方案1】:
使用 VB.Net,我会使用 System.Management(不要忘记在项目 [菜单] -> 添加引用中添加此引用)ManagementObjectSearcher 结合 System.Linq 来找到这样的解决方案,
Imports System
Imports System.Management
Imports System.Linq
Public Module Module1
Public Sub Main()
Console.WriteLine(HasDevice("PointingDevice"))
Console.WriteLine(HasDevice("Keyboard"))
Console.ReadKey()
End Sub
Public Function HasDevice(strtype As String)
Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_" + strtype)
Dim result = From mobj In searcher.Get()
Select mobj Where mobj("Status").ToString() = 0
Return Not IsNothing(result)
End Function
End Module
结果
您也可以对其进行硬编码以避免出现 TRiNE 建议的输入错误(尽管使用 C#)
Public Function HasPointingDevice()
Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_PointingDevice")
Dim result = From mobj In searcher.Get()
Select mobj Where mobj("Status").ToString() = 0
Return Not IsNothing(result)
End Function
Public Function HasKeyboard()
Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_Keyboard")
Dim result = From mobj In searcher.Get()
Select mobj Where mobj("Status").ToString() = 0
Return Not IsNothing(result)
End Function
然后这样称呼他们
Public Sub Main()
Console.WriteLine(HasPointingDevice())
Console.WriteLine(HasKeyboard())
Console.ReadKey()
End Sub
它们会产生相同的结果
【解决方案2】:
您可以使用 C# System.Management 和 ManagementObjectSearcher
这是一个示例代码。根据需要进行修改。
public bool isPointingDeviceAttached()
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_PointingDevice");
int devCount = 0;
foreach (ManagementObject obj in searcher.Get()) {
if(obj["Status"].ToString().Contains("OK")) // if device is ready
devCount++;
}
return devCount>0;
}
public bool isKeyboardAttached()
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Keyboard");
int devCount = 0;
foreach (ManagementObject obj in searcher.Get()) {
if (obj["Status"].ToString().Contains("OK")) // if device is ready
devCount++;
}
return devCount>0;
}
确保添加using System.Management; 行并在引用中添加System.Management。
您可以根据需要使用更多 ManagementObject 属性。这是属性列表和其他一些外部引用。
Pointing device class ref. & attribute list
C#, C++ similar example