在控制台应用程序中挣扎着一个空的Windows消息队列

在下面的(可编译的)示例中,我试图在纯控制台应用程序中侦听Windows消息队列,以便接收有关正在连接/断开连接的USB设备的通知。 我从这里拿出了示例代码: 在C ++非GUI应用程序中检测USB插入/删除

但是,在while语句中对GetMessage的调用永远不会返回,因为Windows不会向我的队列发送任何消息。 我究竟做错了什么? 这与UIPI有什么关系?

我不经常使用MFC / WinAPI,所以请详细解答您的答案。

 #define ANSI #define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x0501 #include <windows.h> #include <winuser.h> #include <Dbt.h> #include <string> #include <iostream> #include <stdexcept> #define HID_CLASSGUID {0x4d1e55b2, 0xf16f, 0x11cf,{ 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}} #define CLS_NAME "DUMMY_CLASS" #define HWND_MESSAGE ((HWND)-3) LRESULT message_handler(HWND__* hwnd, UINT uint, WPARAM wparam, LPARAM lparam) { switch (uint) { case WM_NCCREATE: // before window creation return true; break; case WM_CREATE: // the actual creation of the window { // you can get your creation params here..like GUID.. LPCREATESTRUCT params = (LPCREATESTRUCT) lparam; GUID InterfaceClassGuid = *((GUID*)params->lpCreateParams); DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; NotificationFilter.dbcc_classguid = InterfaceClassGuid; HDEVNOTIFY dev_notify = RegisterDeviceNotification(hwnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); if(dev_notify == NULL) { throw std::runtime_error("Could not register for devicenotifications!"); } break; } case WM_DEVICECHANGE: { PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR) lparam; PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE) lpdb; std::string path; if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { path = std::string(lpdbv->dbcc_name); switch (wparam) { case DBT_DEVICEARRIVAL: std::cout << "new device connected: " << path << "\n"; break; case DBT_DEVICEREMOVECOMPLETE: std::cout << "device disconnected: " << path << "\n"; break; } } break; } } return 0L; } int main(int argc, char* argv[]) { HWND hWnd = NULL; WNDCLASSEX wx; ZeroMemory(&wx, sizeof(wx)); wx.cbSize = sizeof(WNDCLASSEX); wx.lpfnWndProc = reinterpret_cast<WNDPROC>(message_handler); wx.hInstance = reinterpret_cast<HINSTANCE>(GetModuleHandle(0)); wx.style = CS_HREDRAW | CS_VREDRAW; wx.hInstance = GetModuleHandle(0); wx.hbrBackground = (HBRUSH)(COLOR_WINDOW); wx.lpszClassName = CLS_NAME; GUID guid = HID_CLASSGUID; if (RegisterClassEx(&wx)) { hWnd = CreateWindow(CLS_NAME, "DevNotifWnd", WS_ICONIC, 0, 0, CW_USEDEFAULT, 0, HWND_MESSAGE, NULL, GetModuleHandle(0), (void*)&guid); } if(hWnd == NULL) { throw std::runtime_error("Could not create message window!"); } std::cout << "waiting for new devices..\n"; MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } 

Solutions Collecting From Web of "在控制台应用程序中挣扎着一个空的Windows消息队列"