2012-04-16 59 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); 
    } 
}