4

WM_DEVICECHANGE到着を知る方法は?

WndProc上書きされます。私はたくさんのメッセージをキャッチしましたが、タイプのメッセージはありませんWM_DEVICECHANGERegisterDeviceNotification関数が見つからないとリンカに文句を言わせます! だから私はこのブードゥー教の魔法にはまっています。親切に助けてください。

PS: もちろん、私はグーグルでスタック オーバーフローを行ってきました (笑) このすべてのものを約 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_proc は実行されますが、実行されるはずのときは実行されません (もちろん、デバイスの変更では、明確ですか?)

4

1 に答える 1

5

問題は、ブロードキャストを受信しないメッセージのみのウィンドウを作成していることです。

メッセージ専用ウィンドウでは、メッセージを送受信できます。表示されず、z オーダーがなく、列挙できず、ブロードキャスト メッセージを受信しません。ウィンドウは単にメッセージをディスパッチします。

したがって、メッセージのみのウィンドウを使用することはできず、代わりに表示されないトップレベル ウィンドウを作成する必要があります。これを達成するのは簡単です — に渡すのをやめてHWND_MESSAGECreateWindow絶対に を呼び出さないようにしますShowWindow


余談Sleep(1000)ですが、メッセージ ループの途中では大惨事になります。仕事中に居眠りするのではなく、タイムリーにメッセージを送る必要があります。あなたはそれを取り除かなければなりませんSleepGetMessageキューが空の場合はブロックされるため、アプリケーションが熱くなっていることを心配する必要はありません。

メッセージ ループは次のようになります。

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
} 
于 2012-04-16T10:16:19.957 に答える