Behandeln von Videogeräteverlusten
In diesem Thema wird beschrieben, wie Sie Geräteverluste bei Verwendung eines Videoaufnahmegeräts erkennen. Sie enthält die folgenden Abschnitte:
- Registrieren für Gerätebenachrichtigungen
- Abrufen des symbolischen Links des Geräts
- Behandeln von WM_DEVICECHANGE
- Aufheben der Registrierung für Benachrichtigung
- Zugehörige Themen
Registrieren für Gerätebenachrichtigungen
Bevor Sie mit der Erfassung über das Gerät beginnen, rufen Sie die RegisterDeviceNotification-Funktion auf, um sich für Gerätebenachrichtigungen zu registrieren. Registrieren Sie sich für die KSCATEGORY_CAPTURE Geräteklasse, wie im folgenden Code gezeigt.
#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;
}
Abrufen des symbolischen Links des Geräts
Auflisten der Videogeräte auf dem System, wie unter Aufzählen von Videoaufnahmegeräten beschrieben. Wählen Sie ein Gerät aus der Liste aus, und fragen Sie dann das Aktivierungsobjekt nach dem attribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK ab, wie im folgenden Code gezeigt.
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
);
}
Behandeln von WM_DEVICECHANGE
Lauschen Sie in der Nachrichtenschleife auf WM_DEVICECHANGE Nachrichten. Der lParam-Nachrichtenparameter ist ein Zeiger auf eine DEV_BROADCAST_HDR-Struktur .
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;
Vergleichen Sie als Nächstes die Gerätebenachrichtigung wie folgt mit dem symbolischen Link Ihres Geräts:
- Überprüfen Sie den dbch_devicetype Member der DEV_BROADCAST_HDR-Struktur . Wenn der Wert DBT_DEVTYP_DEVICEINTERFACE ist, wandeln Sie den Strukturzeiger in eine DEV_BROADCAST_DEVICEINTERFACE-Struktur um.
- Vergleichen Sie den dbcc_name Member dieser Struktur mit der symbolischen Verknüpfung des Geräts.
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;
}
Aufheben der Registrierung für Benachrichtigung
Rufen Sie vor dem Beenden der Anwendung UnregisterDeviceNotification auf, um die Registrierung für Gerätebenachrichtigungen aufzuheben.
void OnClose(HWND /*hwnd*/)
{
if (g_hdevnotify)
{
UnregisterDeviceNotification(g_hdevnotify);
}
PostQuitMessage(0);
}
Zugehörige Themen