Related to this question, but... is it possible to trigger via API a new hardware device scan? I have a serial port Bluetooth device that I'm pairing automatically via API calls with 32feet.net .NET Bluetooth, which works quite nicely. While i can query for the serial services in the scanning of the device, the COM ports don't show up in the Bluetooth Devices dialog's COM Ports tab.
4 Answers
Not sure if this will help your overall problem but this should answer the question in your first sentence.
I originally did something like this using Nullsoft's NSIS installer a few years ago.
If you just want to trigger a vanilla hardware scan you can use the following code (provided in C# per the .net tag in this question):
This is the wrapper class for the P/Invoke functions
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);
}
This is a sample of how to use them
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...");
I just quickly translated this from the MSDN C++ docs and tested it in a spike so I know it works but it's not production quality. Also, if you care about the specific return codes you can look them up in cfgmgr32.h.

- 3
- 2

- 571
- 5
- 6
-
didn't look at the previous answers but just in case you thought I copied here the original version I did in NSIS: http://forums.winamp.com/showthread.php?t=192348 – Jeronimo Colon III May 14 '10 at 17:27
-
Also, mine is in C# and the MS sample is in classic VB. – Jeronimo Colon III May 14 '10 at 17:28
-
Works like a charm. Notice: YOU HAVE TO RUN THE WINAPI CALLS WITH ADMINISTRATIVE RIGHTS! Tested on Windows 8 x64 – JanW Feb 28 '13 at 13:39
Related to Programmatically uninstall a device in windows device manager
My answer from there:
To force the 'scan for hardware changes' checkout "How To Force Reenumeration of a Device Tree From an Application" the sample there shows how to force the entire tree to be re-enumerated.

- 1,374
- 15
- 24

- 1,734
- 10
- 11
Does my answer at the following help? How can I find out a COM port number of a bluetooth device in c#?
In brief use System.IO.Ports.SerialPort.GetPortNames()
or WMI to list the serial ports, e.g. PowerShell command:
C:\> Get-WmiObject -query "select DeviceID,PNPDeviceID from Win32_SerialPort"
Which can also be done in code.