Windows消息循环

首先理解一句话:“Windows”向应用程序发送了一条消息。这里是指Windows调用了该程序内部的一个函数。

当UpdateWindow被调用后,新建的窗口在屏幕便完全可见了。此时,Windows会为其维护一个消息队列。当事件发生时,Windows会自动将这些事件转化为消息,并将其放置在应用程序的消息队列中。

应用程序通过消息循环来获取消息:

while (GetMessage(&msg, NULL, 0, 0))    //从消息队列中获取消息并放在msg结构中  
    {
        TranslateMessage(&msg);     //将虚拟键消息转换为字符消息  
        DispatchMessage(&msg);      //调度一个消息给窗口程序  
    }

在消息循环中,应用程序将获取到的消息返还给Windows,接下来,Windows会将这条消息发送给合适的窗口过程即WndProc来处理:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
        ...
        return 0;

      ... ...


    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);//不进行处理的消息传给此函数
}        

综上,窗口过程是由Windows来调用的,即当从消息队列中取出消息并递交给Windows后,Windows把消息内容作为参数,回调给其发送消息的窗口的窗口过程。

注:应用程序如果希望调用自身的窗口过程,则可通过函数SendMessage来实现。

原文地址:https://www.cnblogs.com/cknightx/p/7123881.html