Zpracování ztráty video zařízení
Toto téma popisuje, jak zjistit ztrátu zařízení při použití zařízení pro zachycení videa. Obsahuje následující části:
- Zaregistrujte se k oznámení zařízení
- Získat symbolický odkaz zařízení
- Popisovač WM_DEVICECHANGE
- Odhlásit se z odběru oznámení
- související témata
Registrace pro oznámení o zařízení
Než začnete zachytávat ze zařízení, zavolejte funkci RegisterDeviceNotification pro registraci oznámení zařízení. Zaregistrujte třídu zařízení , KSCATEGORY_CAPTURE, jak je znázorněno v následujícím kódu.
#include <Dbt.h>
#include <ks.h>
#include <ksmedia.h>
HDEVNOTIFY g_hdevnotify = NULL;
BOOL RegisterForDeviceNotification(HWND hwnd)
{
DEV_BROADCAST_DEVICEINTERFACE di = { 0 };
di.dbcc_size = sizeof(di);
di.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
di.dbcc_classguid = KSCATEGORY_CAPTURE;
g_hdevnotify = RegisterDeviceNotification(
hwnd,
&di,
DEVICE_NOTIFY_WINDOW_HANDLE
);
if (g_hdevnotify == NULL)
{
return FALSE;
}
return TRUE;
}
Získání symbolického propojení zařízení
Zobrazení výčtu obrazových zařízení v systému, jak je popsáno v Výčet zařízení pro zachycení videa. Ze seznamu vyberte zařízení a potom zadejte dotaz na aktivační objekt pro atribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, jak je znázorněno v následujícím kódu.
WCHAR *g_pwszSymbolicLink = NULL;
UINT32 g_cchSymbolicLink = 0;
HRESULT GetSymbolicLink(IMFActivate *pActivate)
{
return pActivate->GetAllocatedString(
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK,
&g_pwszSymbolicLink,
&g_cchSymbolicLink
);
}
Obsluha WM_DEVICECHANGE
V smyčce zpráv naslouchejte zprávám WM_DEVICECHANGE. Parametr lParam zprávy je ukazatel na strukturu DEV_BROADCAST_HDR.
case WM_DEVICECHANGE:
if (lParam != 0)
{
HRESULT hr = S_OK;
BOOL bDeviceLost = FALSE;
hr = CheckDeviceLost((PDEV_BROADCAST_HDR)lParam, &bDeviceLost);
if (FAILED(hr) || bDeviceLost)
{
CloseDevice();
MessageBox(hwnd, L"Lost the capture device.", NULL, MB_OK);
}
}
return TRUE;
Dále porovnejte zprávu s oznámením o zařízení s symbolickým odkazem na vaše zařízení následujícím způsobem:
- Zkontrolujte dbch_devicetype člen struktury DEV_BROADCAST_HDR. Pokud je hodnota DBT_DEVTYP_DEVICEINTERFACE, přetypujte ukazatel struktury na strukturu DEV_BROADCAST_DEVICEINTERFACE.
- Porovnejte dbcc_name člena této struktury s symbolickým propojením zařízení.
HRESULT CheckDeviceLost(DEV_BROADCAST_HDR *pHdr, BOOL *pbDeviceLost)
{
DEV_BROADCAST_DEVICEINTERFACE *pDi = NULL;
if (pbDeviceLost == NULL)
{
return E_POINTER;
}
*pbDeviceLost = FALSE;
if (g_pSource == NULL)
{
return S_OK;
}
if (pHdr == NULL)
{
return S_OK;
}
if (pHdr->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE)
{
return S_OK;
}
// Compare the device name with the symbolic link.
pDi = (DEV_BROADCAST_DEVICEINTERFACE*)pHdr;
if (g_pwszSymbolicLink)
{
if (_wcsicmp(g_pwszSymbolicLink, pDi->dbcc_name) == 0)
{
*pbDeviceLost = TRUE;
}
}
return S_OK;
}
Odhlásit se z oznámení
Před ukončením aplikace zavolejte UnregisterDeviceNotification pro zrušení registrace oznámení zařízení/
void OnClose(HWND /*hwnd*/)
{
if (g_hdevnotify)
{
UnregisterDeviceNotification(g_hdevnotify);
}
PostQuitMessage(0);
}
Související témata