EventRevWnd.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "stdafx.h"
  2. #include "EventRevWnd.h"
  3. #include <dbt.h>
  4. static CHAR szClassName[MAX_PATH] = "ScannerEvtRevWnd";
  5. static TCHAR szTitle[MAX_PATH] = "ScannerEvtRevWnd_Title";
  6. HWND gEventRevWnd = NULL;
  7. IMediaEventEx *pME = NULL;
  8. BOOL fAlreadyCreated = FALSE;
  9. BOOL WndDlgInit()
  10. {
  11. LOG_FUNCTION();
  12. RegisterWndClass(NULL);
  13. HWND hWnd;
  14. hWnd = CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW,
  15. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL);
  16. if (!hWnd)
  17. {
  18. return FALSE;
  19. }
  20. gEventRevWnd = hWnd;
  21. fAlreadyCreated = TRUE;
  22. MSG msg;
  23. while (GetMessage(&msg, NULL, 0, 0))
  24. {
  25. if (!TranslateAccelerator(msg.hwnd, NULL, &msg))
  26. {
  27. TranslateMessage(&msg);
  28. DispatchMessage(&msg);
  29. }
  30. }
  31. fAlreadyCreated = FALSE;
  32. gEventRevWnd = NULL;
  33. return (BOOL) msg.wParam;
  34. }
  35. ATOM RegisterWndClass(HINSTANCE hInstance)
  36. {
  37. WNDCLASSEX wcex = {0};
  38. wcex.cbSize = sizeof(WNDCLASSEX);
  39. wcex.style = CS_HREDRAW | CS_VREDRAW;
  40. wcex.lpfnWndProc = WndProc;
  41. wcex.cbClsExtra = 0;
  42. wcex.cbWndExtra = 0;
  43. wcex.lpszMenuName = NULL;
  44. wcex.lpszClassName = szClassName;
  45. return RegisterClassEx(&wcex);
  46. }
  47. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  48. {
  49. switch(message)
  50. {
  51. case WM_CREATE:
  52. break;
  53. case WM_DESTROY:
  54. PostQuitMessage(0);
  55. break;
  56. case WM_CLOSE:
  57. break;
  58. case WM_ENDSESSION:
  59. //Session is being ended or the use is logging.
  60. if(wParam || (lParam & ENDSESSION_LOGOFF))
  61. {
  62. }
  63. break;
  64. case WM_TIMER:
  65. break;
  66. case WM_FGNOTIFY:
  67. // uh-oh, something went wrong while capturing - the filtergraph
  68. // will send us events like EC_COMPLETE, EC_USERABORT and the one
  69. // we care about, EC_ERRORABORT.
  70. if(pME)
  71. {
  72. LONG event;
  73. LONG_PTR l1, l2;
  74. HRESULT hrAbort = S_OK;
  75. BOOL bAbort = FALSE;
  76. while(pME->GetEvent(&event, &l1, &l2, 0) == S_OK)
  77. {
  78. pME->FreeEventParams(event, l1, l2);
  79. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetEvent %d, %d, %d", event, l1, l2);
  80. if(event == EC_ERRORABORT)
  81. {
  82. bAbort = TRUE;
  83. hrAbort = static_cast<HRESULT>(l1);
  84. continue;
  85. }
  86. else if(event == EC_DEVICE_LOST)
  87. {
  88. // Check if we have lost a capture filter being used.
  89. // lParam2 of EC_DEVICE_LOST event == 1 indicates device added
  90. // == 0 indicates device removed
  91. if(l2 == 0)
  92. {
  93. IBaseFilter *pf;
  94. IUnknown *punk = (IUnknown *) l1;
  95. if(S_OK == punk->QueryInterface(IID_IBaseFilter, (void **) &pf))
  96. {
  97. //if(::IsEqualObject(gcap.pVCap, pf))
  98. {
  99. pf->Release();
  100. bAbort = FALSE;
  101. break;
  102. }
  103. pf->Release();
  104. }
  105. }
  106. }
  107. } // end while
  108. if(bAbort)
  109. {
  110. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ERROR during capture, error code=0x%08X", hrAbort);
  111. }
  112. }
  113. break;
  114. case WM_DEVICECHANGE:
  115. // We are interested in only device arrival & removal events
  116. if(DBT_DEVICEARRIVAL != wParam && DBT_DEVICEREMOVECOMPLETE != wParam)
  117. break;
  118. PDEV_BROADCAST_HDR pdbh = (PDEV_BROADCAST_HDR) lParam;
  119. if(pdbh->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE)
  120. {
  121. break;
  122. }
  123. PDEV_BROADCAST_DEVICEINTERFACE pdbi = (PDEV_BROADCAST_DEVICEINTERFACE) lParam;
  124. // Check for capture devices.
  125. if(pdbi->dbcc_classguid != AM_KSCATEGORY_CAPTURE)
  126. {
  127. break;
  128. }
  129. // Check for device arrival/removal.
  130. if(DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam)
  131. {
  132. }
  133. break;
  134. }
  135. return (LONG) DefWindowProc(hWnd, message, wParam, lParam);
  136. }
  137. UINT WINAPI EventRevThread(PVOID Param)
  138. {
  139. if(!fAlreadyCreated) {
  140. WndDlgInit();
  141. }
  142. return (UINT)NULL;
  143. }