windows编程,消息函数中拦截消息的问题

Posted 时空观察者9号

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows编程,消息函数中拦截消息的问题相关的知识,希望对你有一定的参考价值。

很多年没有写windows窗口程序了,今天自制基于vulkan的程序时遇到了一些问题,部分代码如下:

LRESULT CALLBACK XWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

    switch (uMsg) {
    case WM_CLOSE:
        //PostQuitMessage(0);
        shouldClose = true;
        break;
    case WM_PAINT:
        //run(info);//return 0;
        break;
    default:
        break;
    }
    return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}

int main()
{
    while (true) {//while1

        MSG msg;
        while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) { //while2
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
     vulkan_render();
    }

上面代码正常运行,当有消息时,windows处理消息,当没有消息时执行渲染函数vulkan_render()。

如果改一下代码:将

    case WM_PAINT:
        break;

改为:

    case WM_PAINT:
        return 0;

渲染函数 vulkan_render将永远不会被执行,循环陷入在while2中出不来了。

原因如下 :

WM_PAINT这个消息一般来说并不频繁,只有当窗口需要重绘时WINDOWS才发送此消息,比如窗口大小改变,窗口最小化再恢复时,窗口移出屏幕外再移回来,注意窗口被其它窗口盖住再重现时不会导致重绘。

如果我们将这个消息在处理函数中直接return,不给后面 DefWindowProc的处理机会,那么WINDOWS就不知道WM_PAINT被处理过了,于是下一帧仍会向程序发送WM_PAINT消息。这样一直循环下去。

因此,消息处理函数不要随便return,除非你很清楚自己在做什么

以上是关于windows编程,消息函数中拦截消息的问题的主要内容,如果未能解决你的问题,请参考以下文章

如果当焦点处于其他应用程序时,如何拦截键盘事件?

Windows消息拦截技术的应用

C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值

猎豹MFC--拦截消息SetWindowsLong CallWindowsProc控件不能满足我们的需求时 增加修改这些功能

windows钩子函数

走进windows编程的世界-----消息处理函数