Ereignisse
19. Nov., 23 Uhr - 21. Nov., 23 Uhr
Gewinnen Sie den Wettbewerbsvorteil, den Sie mit leistungsstarken KI- und Cloud-Lösungen benötigen, indem Sie microsoft Ignite online besuchen.
Jetzt registrierenDieser Browser wird nicht mehr unterstützt.
Führen Sie ein Upgrade auf Microsoft Edge durch, um die neuesten Features, Sicherheitsupdates und den technischen Support zu nutzen.
In diesem Thema wird beschrieben, wie Sie Geräteverluste bei Verwendung eines Videoaufnahmegeräts erkennen. Sie enthält die folgenden Abschnitte:
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;
}
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
);
}
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:
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;
}
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);
}
Ereignisse
19. Nov., 23 Uhr - 21. Nov., 23 Uhr
Gewinnen Sie den Wettbewerbsvorteil, den Sie mit leistungsstarken KI- und Cloud-Lösungen benötigen, indem Sie microsoft Ignite online besuchen.
Jetzt registrieren