2012-04-16 103 views
3

如何知道WM_DEVICECHANGE到达?捕捉WM_DEVICECHANGE

WndProc被覆盖。我收到了大量的消息,但没有一个是WM_DEVICECHANGERegisterDeviceNotification使连接器抱怨它无法找到该功能!所以我被困在这个巫术魔术中。请帮助。

P.S .:当然,我一直在使用google搜索和堆栈(大声笑)所有这些东西大约8个小时。

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
     LPSTR lpCmdLine, int nCmdShow) 
{ 
     LPTSTR lolclassname = "lolclass"; 
    WNDCLASS lolclass; 
    HWND lolwindow; 
    MSG lolmsg; 
    UINT msgstatus; 

    lolclass.style = CS_VREDRAW; 
    lolclass.lpfnWndProc = &lol_wnd_proc; 
    lolclass.cbClsExtra = 0; 
    lolclass.cbWndExtra = 0; 
    lolclass.hInstance = hInstance; 
    lolclass.hIcon = NULL; 
    lolclass.hCursor = NULL; 
    lolclass.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1); 
    lolclass.lpszMenuName = NULL; 
    lolclass.lpszClassName = lolclassname; 
    if(!RegisterClass(&lolclass)) fail("RegisterClassEx"); 

    lolwindow = CreateWindow("lolclass", NULL, WS_MINIMIZE, CW_USEDEFAULT, 
      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
      HWND_MESSAGE, NULL, hInstance, NULL); 

    if(lolwindow == NULL) fail("CreateWindowEx"); 

    /*ShowWindow(lolwindow, nCmdShow); 
    UpdateWindow(lolwindow);*/ 

    do { 
/*  if(!SetWindowPos(lolwindow, HWND_TOPMOST, 1, 1, 1, 1, 
        SWP_HIDEWINDOW)) 
      fail("SetWindowPos");*/ 
     msgstatus = GetMessage(&lolmsg, lolwindow, 0, 0); 
     if(!msgstatus) break; 
     if(msgstatus == - 1) fail("GetMessage"); 
     TranslateMessage(&lolmsg); 
     DispatchMessage(&lolmsg); 
     Sleep(1000); 
    } while(1); 

    return lolmsg.wParam; 
} 

lol_wnd_pro c的执行,但从来没有当它应该(在课程的设备变化,我是清楚了吗?)

+0

我想描述不清晰。如果可能,请重新组织并显示一些代码 – 2012-04-16 04:50:44

+0

为什么您尝试自己编写样板代码,而不是使用广泛分布的样本之一? – 2012-04-16 08:43:52

+3

*是*前缀与'大声笑'的一切问题。即使是操作系统也不会认真对待你。大声笑。 – 2012-04-16 11:03:49

回答

4

的问题是,你正在创建一个message-only window不接收广播:

仅消息窗口允许您发送和接收消息。它不可见,没有z顺序,不能枚举,并且未收到广播消息。窗口只是发送消息。

因此,您不能使用仅限消息的窗口,而是需要创建一个永远不会显示的顶级窗口。这是微不足道的实现 - 停止通过HWND_MESSAGECreateWindow,并确保你永远不会打电话ShowWindow


另外,Sleep(1000)在消息循环的中间将会是一场灾难。你需要及时抽出信息,而不是在工作中睡着。你必须摆脱Sleep。请注意,如果队列为空,GetMessage将会阻塞,因此您不必担心应用程序运行很热。

你的消息循环应该是这样的:

while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) 
{ 
    if (bRet == -1) 
    { 
     // handle the error and possibly exit 
    } 
    else 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
}