Связанный с этим вопросом, но... действительно ли возможно инициировать через API новое сканирование устройства? У меня есть bluetooth-устройство последовательного порта, что я соединяю автоматически через вызовы API с 32feet.net.NET Bluetooth, который работает вполне приятно. В то время как я могу запросить для последовательных сервисов в сканировании устройства, COM-порты не обнаруживаются на вкладке COM Ports диалогового окна bluetooth-устройств.
Связанный с Программное деинсталляция устройства в менеджере устройств windows
Мой ответ оттуда:
Чтобы заставить 'сканирование аппаратуры' changes" checkout "How To Force Восстановление дерева устройств из Приложение " образец там показывает, как заставить всё дерево быть перерегистрированным.
Помогает ли мой ответ на следующий вопрос? Как узнать номер COM-порта устройства Bluetooth в C #?
Вкратце используйте System.IO.Ports.SerialPort.GetPortNames ()
или WMI для вывода списка последовательных портов, например Команда PowerShell:
C:\> Get-WmiObject -query "select DeviceID,PNPDeviceID from Win32_SerialPort"
Что также можно сделать в коде.
Не уверен, что это поможет вашей общей проблеме, но это должно ответить на вопрос в вашем первом предложении.
Первоначально я сделал что-то подобное, используя установщик NSIS от Nullsoft несколько лет назад.
Если вы просто хотите запустить сканирование ванильного оборудования, вы можете использовать следующий код (предоставленный в C# для тега .net в этом вопросе):
Это класс-оболочка для функций P/Invoke
public static class Win32Api
{
public const int CM_LOCATE_DEVNODE_NORMAL = 0x00000000;
public const int CM_REENUMERATE_NORMAL = 0x00000000;
public const int CR_SUCCESS = 0x00000000;
[DllImport("CfgMgr32.dll", SetLastError=true)]
public static extern int CM_Locate_DevNodeA(ref int pdnDevInst, string pDeviceID, int ulFlags);
[DllImport("CfgMgr32.dll", SetLastError=true)]
public static extern int CM_Reenumerate_DevNode(int dnDevInst, int ulFlags);
}
Это пример того, как их использовать
int pdnDevInst = 0;
if (Win32Api.CM_Locate_DevNodeA(ref pdnDevInst, null, Win32Api.CM_LOCATE_DEVNODE_NORMAL) != Win32Api.CR_SUCCESS)
throw new Exception("something...");
if (Win32Api.CM_Reenumerate_DevNode(pdnDevInst, Win32Api.CM_REENUMERATE_NORMAL) != Win32Api.CR_SUCCESS)
throw new Exception("something else...");
Я просто быстро перевел это из документов MSDN C++ и протестировал его в пике, чтобы я знал, что это работает, но это не качество производства. Кроме того, если вы заботитесь о конкретных кодах возврата, вы можете найти их в cfgmgr32.h.
Только что нашел этот пост SO, который также может решить мой вопрос или других, которые находят этот вопрос.