如何找到串口鼠标占用的com-port
以下是我在C#
中检测鼠标的方法(来自此answer的改编代码)
var info = IntPtr.Zero;
try
{
var guid = new Guid("{4d36e96f-e325-11ce-bfc1-08002be10318}"); // mouses
info = SetupDiGetClassDevsW(ref guid, null, IntPtr.Zero, 0);
if ((int)info == -1) // INVALID_HANDLE_VALUE
throw new Exception(string.Format("Error({0}) SetupDiGetClassDevsW", Marshal.GetLastWin32Error()));
// enumerate mouses
var device = new SP_DEVINFO_DATA();
device.cbSize = (UInt32)Marshal.SizeOf(device);
for (uint i = 0; ; i++)
{
// get device info
if (!SetupDiEnumDeviceInfo(info, i, out device))
{
var error = Marshal.GetLastWin32Error();
if (error == 259) // ERROR_NO_MORE_ITEMS
break;
else
throw new Exception(string.Format("Error({0}) SetupDiEnumDeviceInfo", error));
}
string id = GetStringPropertyForDevice(info, device, 1); // SPDRP_HARDWAREID
if (id != null && id.Contains("*PNP0F09")) // Microsoft BallPoint Serial Mouse
{
// ...
// here I want to check com-port, how?
// ...
}
}
}
finally
{
if (info != IntPtr.Zero)
SetupDiDestroyDeviceInfoList(info);
}
删除C#
代码。寻找一般信息(任何语言)。
答案 0 :(得分:1)
您可以使用SysInternalSuite中的Process Monitor并打开设备管理器,然后找出设备管理器从何处获取其值
我在USB鼠标上尝试了它,并且能够获得(在USB输入设备上),如下所示 1.打开鼠标属性(从控制面板) 2.打开ProcMon 3.单击目标图标,然后选择鼠标属性窗口 4.从“鼠标属性”窗口中,打开“硬件”选项卡 5.在ProcMon中单击文件 - > Captuer活动 6.在ProcMon编辑中 - >查找并查找" com"没有引号 7.双击找到的行(如果能够找到它)
另一个解决方案是使用设备管理器命令行实用程序devcon获取设备信息并解析输出流中的信息
有关devcon的更多信息: * http://support.microsoft.com/kb/311272 * https://superuser.com/questions/414280/how-do-i-view-a-list-of-devices-from-the-command-line-in-windows
希望这个帮助
答案 1 :(得分:0)
在设备管理器中生成“位置”字符串的子例程是devmgr.dll!GetLocationInformation
。
您感兴趣的路径 - 生成附加在括号中的值 - 可以使用以下代码表示(基于Hex-Rays的反编译):
int __stdcall GetLocationInformation(DEVINST dnDevInst, wchar_t *lpsResult,
int cchBufferMax, HMACHINE hMachine)
{
int dwUiNumber;
HKEY hKey;
DWORD pulLength;
wchar_t sRawLocationInfo[260];
sRawLocationInfo[0] = 0;
DWORD Type = REG_SZ;
pulLength = 520;
if ( !CM_Open_DevNode_Key_Ex(dnDevInst, KEY_READ, 0, 1u, &hKey, 1u, hMachine) )
{
RegQueryValueExW(hKey, L"LocationInformationOverride", 0, &Type,
sRawLocationInfo, &pulLength);
RegCloseKey(hKey);
}
if ( !sRawLocationInfo[0] )
{
pulLength = 520;
CM_Get_DevNode_Registry_Property_ExW(
dnDevInst,
CM_DRP_LOCATION_INFORMATION,
0,
sRawLocationInfo,
&pulLength,
0,
hMachine);
}
pulLength = 4;
if ( CM_Get_DevNode_Registry_Property_ExW(
dnDevInst,
CM_DRP_UI_NUMBER,
0,
&dwUiNumber,
&pulLength,
0,
hMachine)
|| pulLength <= 0 )
{
<...> //this block always returns
}
else
{
<...>
if ( sRawLocationInfo[0] )
{
lstrcatW(lpsResult, L" (");
lstrcatW(lpsResult, sRawLocationInfo);
lstrcatW(lpsResult, L")");
}
return 0;
}
}
简而言之,括号内的值是设备节点的LocationInformationOverride
或LocationInformation
属性,只有在UiNumber
属性不存在(或伪造)时才会生成。
CM_Open_DevNode_Key_Ex
和CM_Get_DevNode_Registry_Property_ExW
函数在文档中标记为“保留”。你可以
CM_Open_DevNode_Key
和CM_Get_DevNode_Registry_Property
代替。除了缺少hMachine
参数之外,它们与前者完全相同(它们基本上直接称它们用NULL
代替它)。SetupDi
等效,SetupDiOpenDevRegKey
和SetupDiGetDeviceRegistryProperty
,但请注意,此API是Vista中的新增功能,并使用不同的数据类型。
如果my guess是正确的,您在设备管理器中看到的“USB串行端口(COM6)”实际上是父设备的名称(=设备管理器中显示的设备连接到的设备)通过连接“模式”查看设备。如果这是正确的,“COM6”只是名称的一部分,而不是某些独立的属性。