2010-02-02 4 views
9

En relation avec this question, mais ... est-il possible de déclencher via l'API un nouveau balayage de périphérique matériel? J'ai un périphérique Bluetooth de port série que j'associe automatiquement via des appels d'API avec 32feet.net .NET Bluetooth, ce qui fonctionne très bien. Bien que je puisse interroger les services série lors de l'analyse du périphérique, les ports COM n'apparaissent pas dans l'onglet Ports COM de la boîte de dialogue Périphériques Bluetooth.Existe-t-il un appel d'API pour lancer une analyse pour les périphériques matériels

Répondre

1

Est-ce que ma réponse à l'aide suivante? How can I find out a COM port number of a bluetooth device in c#?

En bref, utilisez System.IO.Ports.SerialPort.GetPortNames() ou WMI pour répertorier les ports série, par ex. Commande PowerShell:

C:\> Get-WmiObject -query "select DeviceID,PNPDeviceID from Win32_SerialPort" 

Ce qui peut également être fait dans le code.

10

Vous ne savez pas si cela aidera votre problème global, mais cela devrait répondre à la question dans votre première phrase. À l'origine, j'ai fait quelque chose comme ça en utilisant l'installateur NSIS de Nullsoft il y a quelques années.

Si vous voulez juste pour déclencher une analyse du matériel de vanille vous pouvez utiliser le code suivant (fourni en C# par la balise .net dans cette question):

C'est la classe wrapper pour les fonctions 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); 
} 

Ceci est un exemple de la façon de les utiliser

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..."); 

Je l'ai rapidement traduit à partir des documents MSDN C++ et je l'ai testé dans un spike, donc je sais que cela fonctionne mais ce n'est pas la qualité de production. En outre, si vous vous intéressez aux codes de retour spécifiques, vous pouvez les rechercher dans cfgmgr32.h.

+0

n'a pas regardé les réponses précédentes, mais juste au cas où vous pensiez que j'ai copié ici la version originale que j'ai faite dans NSIS: http://forums.winamp.com/showthread.php?t=192348 –

+0

Aussi, le mien est en C# et l'échantillon MS est en VB classique. –

+0

Fonctionne comme un charme. Avis: VOUS DEVEZ EXÉCUTER LES APPELS WINAPI AVEC DES DROITS ADMINISTRATIFS! Testé sur Windows 8 x64 – JanW

1

Juste trouvé this SO post qui peut aussi résoudre mon problème ou d'autres qui trouvent cette question.

Questions connexes