显示窗口后执行代码

时间:2011-09-20 12:17:47

标签: winapi event-loop

我正在开发一个Windows应用程序,我正在实现整个事件循环以及我自己的一切(这是有原因的)。在一个地方,我需要在显示窗口后执行一些代码。通常,在创建窗口时,我会在收到WM_CREATE消息时进行初始化。 WM_SHOWWINDOW仅在显示窗口之前发送。但是,我需要在第一次显示窗口后立即执行一些代码。我似乎无法找到窗口显示后发送的通知消息。可能没有一个吗?

当然,我可以保留一个布尔值 - FirstRun - 指示我是否已经执行了我的逻辑,然后在收到WM_ACTIVATE时执行代码,前提是布尔值为TRUE,然后将FirstRun设置为FALSE,以便代码为我下次收到WM_ACTIVATE时没有执行,但这对我来说似乎有点不自然。

自从我在这个级别上进行win32编程以来已经很久了,所以不记得太多了。这里最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

没有特别的通知,但在很多情况下你可以使用这个技巧:

LRESULT CALLBACK MainWndProc(
HWND hwnd,        // handle to window
UINT uMsg,        // message identifier
WPARAM wParam,    // first message parameter
LPARAM lParam)    // second message parameter
{ 
switch (uMsg) 
{ 
    case WM_USER + 100:
        //window is just displayed, do some actions
        return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    case WM_CREATE:
        PostMessage(hwnd, WM_USER + 100, 0, 0);
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    default: 
        return DefWindowProc(hwnd, uMsg, wParam, lParam); 
}
return 0;
}

答案 1 :(得分:0)

没有一个,因为这就是WM_SHOWWINDOW的用途。将该消息传递给默认消息处理过程后,将显示该窗口。您可以做的最好的事情是使用IsWindowVisible通过某种计时器进行投票。

你的程序设计似乎有缺陷,但必须依赖这样的东西。你想做什么?

答案 2 :(得分:0)

只要您实现整个事件循环以及您自己的所有事情,就可以像这样直接在WinMain()中进行处理:

HWND hWnd = CreateWindow(...);

if (!hWnd) return 0;

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

OnWindowJustDisplayed();    // here

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}