Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Depois de autenticar um aplicativo, você pode começar a enumerar os dispositivos detetados pelo Gerenciador de dispositivos do Windows Media. A enumeração é feita usando uma interface de enumeração, IWMDMEnumDevice, obtida usando IWMDeviceManager2::EnumDevices2 ou IWMDeviceManager::EnumDevices. Se houver suporte, use o método EnumDevices2, porque a versão anterior só retornava interfaces herdadas em dispositivos, enquanto a nova versão retorna as interfaces herdadas e as novas.
Antes de obter um enumerador, você deve decidir qual exibição de enumeração usar. Alguns dispositivos expõem cada armazenamento como um dispositivo diferente. Por exemplo, dois cartões de memória flash em um dispositivo serão enumerados como se fossem dispositivos separados. Você pode especificar que todos os armazenamentos em um dispositivo sejam enumerados juntos como um único dispositivo. Pode definir esta preferência apenas uma vez na sua aplicação; Se você quiser alterá-lo, você deve desligar o aplicativo e reiniciá-lo. No entanto, observe que os dispositivos herdados às vezes ignoram uma solicitação para enumerar armazenamentos de dispositivos separados como um único dispositivo e continuam a enumerá-los separadamente.
As etapas a seguir mostram como enumerar dispositivos conectados:
- Defina a preferência de enumeração do dispositivo usando IWMDeviceManager3::SetDeviceEnumPreference. Se esse método não for chamado, o método padrão é mostrar armazenamentos como dispositivos separados. Para determinar se "dispositivos" individuais são realmente armazenamentos no mesmo dispositivo, chame IWMDMDevice2::GetCanonicalName; Os armazenamentos do mesmo dispositivo retornarão valores idênticos, exceto para o dígito final após o último sinal de "$".
- Pesquise IWMDeviceManager ou IWMDeviceManager2e, em seguida, chame IWMDeviceManager2::EnumDevices2 para obter a interface do enumerador de dispositivos IWMDMEnumDevice. (Se suportado, use EnumDevices2, que é mais eficiente, pois a versão anterior pode não retornar dispositivos MTP).
- Chame o método IWMDMEnumDevices::Next para recuperar um ou mais dispositivos de uma só vez. Continue a chamar esse método até que o método retorne S_FALSE ou uma mensagem de erro. Se recuperar apenas um dispositivo de cada vez, não é necessário alocar uma matriz para armazenar os dispositivos.
Como os usuários podem anexar ou remover dispositivos do computador enquanto o aplicativo está em execução, é uma boa ideia implementar a notificação de conexão ou remoção do dispositivo. Isso é feito implementando a interface IWMDMNotification e registrando-a. Para obter mais informações sobre isso, consulte Ativação de notificações.
O código C++ a seguir enumera dispositivos e solicita informações sobre cada dispositivo.
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;
}
Tópicos relacionados