DeviceController.cpp
上传用户:hhs829
上传日期:2022-06-17
资源大小:586k
文件大小:3k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // DeviceController.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "DsDemo.h"
  5. #include "DeviceController.h"
  6. #include <streams.h>
  7. #include "Dbt.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CDeviceController
  15. IMPLEMENT_DYNCREATE(CDeviceController, CFrameWnd)
  16. CDeviceController::CDeviceController()
  17. {
  18. }
  19. CDeviceController::~CDeviceController()
  20. {
  21. }
  22. BEGIN_MESSAGE_MAP(CDeviceController, CFrameWnd)
  23. //{{AFX_MSG_MAP(CDeviceController)
  24. // NOTE - the ClassWizard will add and remove mapping macros here.
  25. ON_WM_CREATE()
  26. ON_WM_CLOSE()
  27. ON_WM_DEVICECHANGE()
  28. //}}AFX_MSG_MAP
  29. END_MESSAGE_MAP()
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CDeviceController message handlers
  32. void CDeviceController::Register(void)
  33. {
  34. DEV_BROADCAST_DEVICEINTERFACE filterData;
  35. ZeroMemory(&filterData, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
  36. filterData.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
  37. filterData.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
  38. filterData.dbcc_classguid = AM_KSCATEGORY_CAPTURE;
  39. mUnregisterDeviceNotification = NULL;
  40. mRegisterDeviceNotification = NULL;
  41. // dynload device removal APIs
  42. {
  43. HMODULE hmodUser = GetModuleHandle(TEXT("user32.dll"));
  44. ASSERT(hmodUser);    // we link to user32
  45. mUnregisterDeviceNotification = (PUnregisterDeviceNotification)
  46. GetProcAddress(hmodUser, "UnregisterDeviceNotification");
  47. // m_pRegisterDeviceNotification is prototyped differently in unicode
  48. mRegisterDeviceNotification = (PRegisterDeviceNotification)
  49. GetProcAddress(hmodUser,
  50. #ifdef UNICODE
  51.    "RegisterDeviceNotificationW"
  52. #else
  53.    "RegisterDeviceNotificationA"
  54. #endif
  55.    );
  56. // failures expected on older platforms.
  57. ASSERT(mRegisterDeviceNotification && mUnregisterDeviceNotification ||
  58.    !mRegisterDeviceNotification && !mUnregisterDeviceNotification);
  59. }
  60. mNotifyHandle = NULL;
  61. if (mRegisterDeviceNotification)
  62. {
  63. mNotifyHandle = mRegisterDeviceNotification(this->GetSafeHwnd(), &filterData, DEVICE_NOTIFY_WINDOW_HANDLE);
  64. ASSERT(mNotifyHandle != NULL);
  65. }
  66. }
  67. void CDeviceController::Unregister(void)
  68. {
  69. if (mNotifyHandle != NULL)
  70. {
  71. ASSERT(mUnregisterDeviceNotification);
  72. mUnregisterDeviceNotification(mNotifyHandle);
  73. mNotifyHandle = NULL;
  74. }
  75. }
  76. int CDeviceController::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  77. {
  78. int createResult = CFrameWnd::OnCreate(lpCreateStruct);
  79. if (createResult != -1)
  80. {
  81. Register();
  82. }
  83. return createResult;
  84. }
  85. void CDeviceController::OnClose() 
  86. {
  87. Unregister();
  88. CFrameWnd::OnClose();
  89. }
  90. BOOL CDeviceController::OnDeviceChange( UINT nEventType, DWORD dwData )
  91. {
  92. // We are interested in only device arrival & removal events
  93. if (DBT_DEVICEARRIVAL != nEventType && DBT_DEVICEREMOVECOMPLETE != nEventType)
  94. return CWnd::OnDeviceChange (nEventType, dwData);
  95. // ...
  96. return CWnd::OnDeviceChange (nEventType, dwData);
  97. }