<small id='zKR2G'></small><noframes id='zKR2G'>

  • <i id='zKR2G'><tr id='zKR2G'><dt id='zKR2G'><q id='zKR2G'><span id='zKR2G'><b id='zKR2G'><form id='zKR2G'><ins id='zKR2G'></ins><ul id='zKR2G'></ul><sub id='zKR2G'></sub></form><legend id='zKR2G'></legend><bdo id='zKR2G'><pre id='zKR2G'><center id='zKR2G'></center></pre></bdo></b><th id='zKR2G'></th></span></q></dt></tr></i><div id='zKR2G'><tfoot id='zKR2G'></tfoot><dl id='zKR2G'><fieldset id='zKR2G'></fieldset></dl></div>

      <tfoot id='zKR2G'></tfoot><legend id='zKR2G'><style id='zKR2G'><dir id='zKR2G'><q id='zKR2G'></q></dir></style></legend>

          <bdo id='zKR2G'></bdo><ul id='zKR2G'></ul>

        使用 C++ 在 Windows 中检测 USB 插入/移除事件

        时间:2023-05-23
      1. <tfoot id='QUjVJ'></tfoot>

            <tbody id='QUjVJ'></tbody>

                <small id='QUjVJ'></small><noframes id='QUjVJ'>

                • <bdo id='QUjVJ'></bdo><ul id='QUjVJ'></ul>
                  <legend id='QUjVJ'><style id='QUjVJ'><dir id='QUjVJ'><q id='QUjVJ'></q></dir></style></legend>
                  <i id='QUjVJ'><tr id='QUjVJ'><dt id='QUjVJ'><q id='QUjVJ'><span id='QUjVJ'><b id='QUjVJ'><form id='QUjVJ'><ins id='QUjVJ'></ins><ul id='QUjVJ'></ul><sub id='QUjVJ'></sub></form><legend id='QUjVJ'></legend><bdo id='QUjVJ'><pre id='QUjVJ'><center id='QUjVJ'></center></pre></bdo></b><th id='QUjVJ'></th></span></q></dt></tr></i><div id='QUjVJ'><tfoot id='QUjVJ'></tfoot><dl id='QUjVJ'><fieldset id='QUjVJ'></fieldset></dl></div>
                • 本文介绍了使用 C++ 在 Windows 中检测 USB 插入/移除事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  限时送ChatGPT账号..

                  我正在为需要处理 USB 插入/移除事件的现有应用程序编写扩展程序.我知道感兴趣设备的 VID/PID.但是,我无权访问窗口句柄,所以我不知道 RegisterDeviceNotification 是否会有很多用处,除非有办法通过 WINAPI<获取句柄/代码>.使用 C++ 检测 USB 插入/移除事件的最佳方法是什么?

                  I am writing an extension for an existing application that needs to handle USB insertion/removal events. I know the VID/PID of the device of interest. However, I don't have access to the window handle, so I don't know if RegisterDeviceNotification will be of much use, unless there is a way to obtain the handle via the WINAPI. What would be the best way to detect USB insertion/removal events with C++?

                  微软网站上的这个示例代码 显示了如何通过 WMI 接收事件通知:

                  This sample code on the Microsoft website shows how to receive event notifications via WMI:

                  如何修改它以接收 USB 插入/移除事件?或者,我还有其他方法可以解决这个问题吗?我使用的是 Visual Studio 2008.谢谢.

                  How could it be modified to receive USB insertion/removal events? Or, is there another way I should be going about this? I am using Visual Studio 2008. Thanks.

                  附加信息

                  这是我目前所拥有的(减去错误处理):

                  This is what I have so far (minus error-handling):

                  DEFINE_GUID(GUID_INTERFACE_CP210x, 0x993f7832, 0x6e2d, 0x4a0f, 0xb2, 0x72, 0xe2, 0xc7, 0x8e, 0x74, 0xf9, 0x3e);
                  
                  MyClass::MyClass()
                  {
                      // Generate message-only window
                      _pWndClassEx = (WNDCLASSEX *)malloc( sizeof(WNDCLASSEX) );
                      memset( _pWndClassEx, 0, sizeof(WNDCLASSEX) );
                      _pWndClassEx->cbSize = sizeof(WNDCLASSEX);
                      _pWndClassEx->lpfnWndProc = (WNDPROC)WndProc; // function which will handle messages
                      _pWndClassEx->hInstance = GetCurrentModule();
                      _pWndClassEx->lpszClassName = pClassName;
                      atom = RegisterClassEx( _pWndClassEx );
                      _hWnd = CreateWindowEx( 0, pClassName, pWindowName, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL );
                  
                      // Register the USB device for notification
                      _pDevIF = (DEV_BROADCAST_DEVICEINTERFACE *)malloc( sizeof(DEV_BROADCAST_DEVICEINTERFACE) );
                      memset( _pDevIF, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE) );
                      _pDevIF->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
                      _pDevIF->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
                      _pDevIF->dbcc_classguid = GUID_INTERFACE_CP210x;
                      _hNotifyDevNode = RegisterDeviceNotification( _hWnd, _pDevIF, DEVICE_NOTIFY_WINDOW_HANDLE );
                  }
                  
                  static bool OnDeviceChange(UINT nEventType, DWORD dwData)
                  {
                      switch ( nEventType )
                      {
                      case DBT_DEVICEARRIVAL:
                          // A device has been inserted adn is now available.
                          break;
                  
                      case DBT_DEVICEREMOVECOMPLETE:
                          // Device has been removed.
                          break;
                  
                      default:
                          break;
                      }
                  
                      return true;
                  }
                  
                  static LRESULT WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
                  {
                      switch ( message )
                      {
                      case WM_DEVICECHANGE:
                          OnDeviceChange( wParam, lParam ); // Set breakpoint (never gets here)
                          break;
                  
                      default:
                          break;
                      }
                  
                      return DefWindowProc(hwnd, message, wParam, lParam);
                  }
                  

                  PC 进入 WndProc,但在我移除/插入 USB 设备时不会.PC 似乎从未进入 OnDeviceChange.任何提示将不胜感激.我需要处理 USB 设备的意外插入/移除.如果有所不同,USB 设备将作为 Windows 的虚拟 COM 端口出现.谢谢.

                  The PC gets into WndProc, but not when I remove/insert my USB device. The PC never seems to get into OnDeviceChange. Any tips would be appreciated. I need to handle unexpected insertions/removals of the USB device. If it makes a difference, the USB device appears as a virtual COM port to Windows. Thanks.

                  附加信息: 使用 RegisterClassEx 返回的类 atom 调用 CreateWindowEx 失败并显示错误消息,找不到窗口类."

                  Aditional info: Calling CreateWindowEx using the class atom returned by RegisterClassEx fails with the error message, "Cannot find window class."

                  _hWnd = CreateWindowEx( 0, (LPCTSTR)&atom, pWindowName, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL );
                  

                  新方法

                  我也在尝试这种新方法.我正在尝试编写一个仅消息窗口来接收 USB 设备的设备更改通知消息.我正在使用 MFC、C++ 和 Visual Studio 2008.一切都可以编译,并且它在运行时不会崩溃或锁定,但从未触发事件处理程序.感兴趣的设备作为虚拟 COM 端口安装在 Windows 上.

                  I'm also trying this new approach. I'm trying to get write a message-only window to receive device change notification messages for a USB device. I am using MFC, C++, and Visual Studio 2008. Everything compiles, and it runs without crashing or locking up, but the event handler is never triggered. The device of interest is installed on Windows as a virtual COM port.

                  我的主应用程序实例化下面描述的类,然后使用 while 循环等待来自键盘轮询的字符输入.正是在这段等待时间内,我移除并插入了我的 USB 设备,期待事件被触发.

                  My main application instantiates the class described below then waits for a character input from the keyboard polling using a while loop. It is during this wait time that I remove and insert my USB device expecting the event to get fired.

                  class CMessageOnlyWindow : public CWnd
                  {
                      DECLARE_DYNAMIC(CMessageOnlyWindow)
                  private:
                      DEV_BROADCAST_DEVICEINTERFACE * _pDevIF; // The notification filter.
                      HDEVNOTIFY _hNotifyDev;             // The device notification handle.
                  public:
                      CMessageOnlyWindow();
                      virtual ~CMessageOnlyWindow();
                  protected:
                      afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData );
                  private:
                      void RegisterNotification( void );
                      void UnregisterNotification( void );
                  protected:
                      DECLARE_MESSAGE_MAP()               // Must be last.
                  };
                  

                  为简单起见,我删除了所有清理和错误处理:

                  For simplicity, I've removed all the cleanup and error-handling:

                  DEFINE_GUID(GUID_INTERFACE_CP210x, 0x993f7832, 0x6e2d, 0x4a0f, 
                      0xb2, 0x72, 0xe2, 0xc7, 0x8e, 0x74, 0xf9, 0x3e);
                  
                  IMPLEMENT_DYNAMIC(CMessageOnlyWindow, CWnd)
                  
                  CMessageOnlyWindow::CMessageOnlyWindow()
                  {
                      CString cstrWndClassName = ::AfxRegisterWndClass( NULL );
                      BOOL bCreated = this->CreateEx( 0, cstrWndClassName,
                          L"CMessageOnlyWindow", 0, 0, 0, 0, 0, HWND_MESSAGE, 0 );
                      this->RegisterNotification();
                  }
                  
                  CMessageOnlyWindow::~CMessageOnlyWindow() {}
                  
                  BEGIN_MESSAGE_MAP(CMessageOnlyWindow, CWnd)
                      ON_WM_DEVICECHANGE()
                  END_MESSAGE_MAP()
                  
                  afx_msg BOOL CMessageOnlyWindow::OnDeviceChange( UINT nEventType, DWORD dwData )
                  {
                      switch ( nEventType ) // <-- Never gets here.
                      {
                      case DBT_DEVICEARRIVAL:
                          break;
                  
                      case DBT_DEVICEREMOVECOMPLETE:
                          break;
                  
                      default:
                          break;
                      }
                  
                      return TRUE;
                  }
                  
                  void CMessageOnlyWindow::RegisterNotification(void)
                  {
                      _pDevIF = (DEV_BROADCAST_DEVICEINTERFACE *)malloc( sizeof(DEV_BROADCAST_DEVICEINTERFACE) );
                      memset( _pDevIF, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE) );
                      _pDevIF->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
                      _pDevIF->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
                      _pDevIF->dbcc_classguid = GUID_INTERFACE_CP210x;
                      _hNotifyDev = RegisterDeviceNotification( this->m_hWnd, _pDevIF, DEVICE_NOTIFY_WINDOW_HANDLE );
                  }
                  
                  void CMessageOnlyWindow::UnregisterNotification(void)
                  {
                      UnregisterDeviceNotification( _hNotifyDev );
                  }
                  

                  任何想法或建议将不胜感激.如果缺少任何细节,请告诉我,我会很乐意添加它们.谢谢.

                  Any thoughts or suggestions would be much appreciated. If any details are missing, let me know, and I will be glad to add them. Thanks.

                  仅消息窗口需要在新线程中启动,还是创建新窗口会自动脱离新线程?

                  Does the message-only window need to be started in a new thread, or does creating a new window automatically spin off a new thread?

                  推荐答案

                  创建一个只等待 WM_DEVICECHANGE 并使用 RegisterDeviceNotification 注册该窗口的虚拟窗口.恕我直言,WMI 在这里有点矫枉过正.

                  Create a dummy window that does nothing but wait for WM_DEVICECHANGE and register that window using RegisterDeviceNotification. WMI is an overkill here, IMHO.

                  这篇关于使用 C++ 在 Windows 中检测 USB 插入/移除事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  • <bdo id='fNr12'></bdo><ul id='fNr12'></ul>

                    <small id='fNr12'></small><noframes id='fNr12'>

                      <tfoot id='fNr12'></tfoot>

                          <i id='fNr12'><tr id='fNr12'><dt id='fNr12'><q id='fNr12'><span id='fNr12'><b id='fNr12'><form id='fNr12'><ins id='fNr12'></ins><ul id='fNr12'></ul><sub id='fNr12'></sub></form><legend id='fNr12'></legend><bdo id='fNr12'><pre id='fNr12'><center id='fNr12'></center></pre></bdo></b><th id='fNr12'></th></span></q></dt></tr></i><div id='fNr12'><tfoot id='fNr12'></tfoot><dl id='fNr12'><fieldset id='fNr12'></fieldset></dl></div>

                            <tbody id='fNr12'></tbody>
                          <legend id='fNr12'><style id='fNr12'><dir id='fNr12'><q id='fNr12'></q></dir></style></legend>