查找串行鼠标使用的com-port

时间:2014-09-05 13:07:13

标签: windows device

如何找到串口鼠标占用的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#代码。寻找一般信息(任何语言)。

2 个答案:

答案 0 :(得分:1)

您可以使用SysInternalSuite中的Process Monitor并打开设备管理器,然后找出设备管理器从何处获取其值

我在USB鼠标上尝试了它,并且能够获得(在USB输入设备上),如下所示 1.打开鼠标属性(从控制面板) enter image description here 2.打开ProcMon 3.单击目标图标,然后选择鼠标属性窗口 enter image description here 4.从“鼠标属性”窗口中,打开“硬件”选项卡 5.在ProcMon中单击文件 - > Captuer活动 6.在ProcMon编辑中 - >查找并查找" com"没有引号 7.双击找到的行(如果能够找到它)

Process Monitor Registry Event Properties

另一个解决方案是使用设备管理器命令行实用程序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;
  }
}

简而言之,括号内的值是设备节点的LocationInformationOverrideLocationInformation属性,只有在UiNumber属性不存在(或伪造)时才会生成。

CM_Open_DevNode_Key_ExCM_Get_DevNode_Registry_Property_ExW函数在文档中标记为“保留”。你可以

如果my guess是正确的,您在设备管理器中看到的“USB串行端口(COM6)”实际上是父设备的名称(=设备管理器中显示的设备连接到的设备)通过连接“模式”查看设备。如果这是正确的,“COM6”只是名称的一部分,而不是某些独立的属性。