Énumération des appareils Windows Media Gestionnaire de périphériques
Après l’authentification d’une application, vous pouvez commencer à énumérer les appareils détectés par Windows Media Gestionnaire de périphériques. L’énumération est effectuée à l’aide d’une interface d’énumération, IWMDMEnumDeviceDevice, obtenue à l’aide de IWMDeviceManager2::EnumDevices2 ou IWMDeviceManager::EnumDevices. Si elle est prise en charge, utilisez la méthode EnumDevices2 , car la version antérieure renvoyait uniquement les interfaces héritées sur les appareils, tandis que la nouvelle version retourne à la fois les interfaces héritées et les nouvelles interfaces.
Avant d’obtenir un énumérateur, vous devez décider de l’affichage d’énumération à utiliser. Certains appareils exposent chaque stockage en tant qu’appareil différent. Par exemple, deux cartes mémoire flash sur un appareil s’énumérent comme s’il s’agissait d’appareils distincts. Vous pouvez spécifier que tous les stockages d’un appareil sont énumérés ensemble en tant qu’appareil unique. Vous ne pouvez définir cette préférence qu’une seule fois dans votre application ; si vous souhaitez le modifier, vous devez arrêter l’application et la redémarrer. Toutefois, notez que les appareils hérités ignorent parfois une demande d’énumération de stockages d’appareils distincts en tant qu’appareil unique et continuent à les énumérer séparément.
Les étapes suivantes montrent comment énumérer les appareils connectés :
- Définissez la préférence d’énumération d’appareil à l’aide de IWMDeviceManager3::SetDeviceEnumPreference. Si cette méthode n’est pas appelée, la méthode par défaut consiste à afficher les stockages en tant qu’appareils distincts. Pour déterminer si des « appareils » individuels sont en fait des stockages sur le même appareil, appelez IWMDMDevice2::GetCanonicalName; les stockages du même appareil retournent des valeurs identiques, à l’exception du dernier chiffre après le dernier signe « $ ».
- Interrogez IWMDeviceManager ou IWMDeviceManager2, puis appelez IWMDeviceManager2::EnumDevices2 pour obtenir l’interface d’énumérateur d’appareil, IWMDMEnumDevice. (Si prise en charge, utilisez EnumDevices2, ce qui est plus efficace, car la version antérieure risque de ne pas renvoyer les appareils MTP).
- Appelez la méthode IWMDMEnumDevices::Next pour récupérer un ou plusieurs appareils à la fois. Continuez à appeler cette méthode jusqu’à ce que la méthode retourne S_FALSE ou un message d’erreur. Si vous récupérez un seul appareil à la fois, vous n’avez pas besoin d’allouer un tableau pour contenir les appareils.
Étant donné que les utilisateurs peuvent attacher ou supprimer des appareils de l’ordinateur pendant l’exécution de votre application, il est judicieux d’implémenter une notification de connexion ou de suppression d’appareil. Pour ce faire, implémentez l’interface IWMDMNotification et inscrivez-la. Pour plus d’informations à ce sujet, consultez Activation des notifications.
Le code C++ suivant énumère les appareils et demande des informations sur chaque appareil.
HRESULT CWMDMController::EnumDevices()
{
HRESULT hr = S_OK;
// Change behavior to show devices as one object, not each storage as a device.
// This can be called only once for each instance of this application.
CComQIPtr<IWMDeviceManager3>pDevMgr3(m_IWMDMDeviceMgr);
hr = pDevMgr3->SetDeviceEnumPreference(DO_NOT_VIRTUALIZE_STORAGES_AS_DEVICES);
// Get number of attached devices.
DWORD iDevices = 0;
hr = m_IWMDMDeviceMgr->GetDeviceCount(&iDevices);
if (hr == S_OK)
{
// TODO: Display count of devices.
}
//
// Get a device enumerator to enumerate devices.
//
CComPtr<IWMDeviceManager2> pDevMgr2;
hr = m_IWMDMDeviceMgr->QueryInterface (__uuidof(IWMDeviceManager2), (void**) &pDevMgr2);
if (hr == S_OK)
{
// TODO: Display message indicating that application obtained IWMDeviceManager2.
}
else
{
// TODO: Display message indicating that we couldn't
// get IWMDeviceManager2 in EnumDevices.
return hr;
}
CComPtr<IWMDMEnumDevice> pEnumDevice;
hr = pDevMgr2->EnumDevices2(&pEnumDevice);
if (hr != S_OK)
{
// TODO: Display messaging indicating that an error occurred
// in calling EnumDevices2.
return hr;
}
// Length of all the strings we'll send in.
const UINT MAX_CHARS = 100;
// Iterate through devices.
while(TRUE)
{
// Get a device handle.
IWMDMDevice *pIWMDMDevice;
ULONG ulFetched = 0;
hr = pEnumDevice->Next(1, &pIWMDMDevice, &ulFetched);
if ((hr != S_OK) || (ulFetched != 1))
{
break;
}
// Get a display icon for the device.
ULONG deviceIcon = 0;
hr = pIWMDMDevice->GetDeviceIcon(&deviceIcon);
// Print the device manufacturer.
WCHAR manufacturer[MAX_CHARS];
hr = pIWMDMDevice->GetManufacturer((LPWSTR)&manufacturer, MAX_CHARS);
if (hr == S_OK)
{
// TODO: Display manufacturer name.
}
// Get the device name.
WCHAR name[MAX_CHARS];
hr = pIWMDMDevice->GetName((LPWSTR)&name, MAX_CHARS);
if (hr == S_OK)
{
// TODO: Display name.
}
// TODO: Get other device information if wanted.
// Obtain an IWMDMDevice2 interface and call some methods.
CComQIPtr<IWMDMDevice2> pIWMDMDevice2(pIWMDMDevice);
if (pIWMDMDevice2 != NULL)
{
// Get the canonical name.
WCHAR canonicalName[MAX_CHARS];
hr = pIWMDMDevice2->GetCanonicalName(canonicalName, MAX_CHARS);
if (hr == S_OK)
{
// TODO: Display canonical name.
}
}
// Obtain an IWMDMDevice3 interface and call some methods.
CComQIPtr<IWMDMDevice3>pIWMDMDevice3(pIWMDMDevice);
if (pIWMDMDevice3 != NULL)
{
// Find out what protocol is being used.
PROPVARIANT val;
PropVariantInit(&val);
hr = pIWMDMDevice3->GetProperty(g_wszWMDMDeviceProtocol, &val);
if (hr == S_OK)
{
if (*val.puuid == WMDM_DEVICE_PROTOCOL_RAPI)
{
// TODO: Display message indicating device is a RAPI device.
}
else if (*val.puuid == WMDM_DEVICE_PROTOCOL_MTP)
{
/ /TODO: Display message indicating device is an MTP device.
}
else if (*val.puuid == WMDM_DEVICE_PROTOCOL_MSC)
{
// TODO: Display message indicating device is an MSC device.
}
else
{
// TODO: Display message indicating that the
// application encountered an unknown protocol.
}
PropVariantClear(&val);
}
}
// Examine the device capabilities. You could use some of these
// to enable or disable the application's UI elements.
CComQIPtr<IWMDMDeviceControl> pDeviceControl(pIWMDMDevice);
if (pDeviceControl != NULL)
{
DWORD caps = 0;
hr = pDeviceControl->GetCapabilities(&caps);
if (caps & WMDM_DEVICECAP_CANPLAY)
{
// TODO: Display message indicating that the media
// device can play MP3 audio.
}
// TODO: Test for other capabilities here.
}
} // Get the next device.
return hr;
}
Rubriques connexes