views:

415

answers:

4

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.

+1  A: 

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.

Ruddy
Thanks Ruddy, that sounds right. I'll try it soon.
kenny
+1  A: 

Does my answer at the following help? http://stackoverflow.com/questions/2085179/how-can-i-find-out-a-com-port-number-of-a-bluetooth-device-in-c/2119058#2119058

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.

alanjmcf
+1  A: 

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("setupapi.dll", SetLastError=true)]
    public static extern int CM_Locate_DevNodeA(ref int pdnDevInst, string pDeviceID, int ulFlags);

    [DllImport("setupapi.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.

Jeronimo Colon III
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
Also, mine is in C# and the MS sample is in classic VB.
Jeronimo Colon III
+1  A: 

Just found this SO post that also may solve my issue or others that find this question.

kenny