Win32应用程序中的窗口无法正常关闭

原始问题:

尽管我的窗口过程函数能够检测到WM_CLOSE消息,并且调用PostQuitMessage并让Windows继续使用来处理窗口消息,但是我有一个窗口在创建后无法立即关闭DefWindowProc

但是,通过拖动标题栏移动窗口后,它似乎可以正常关闭。

我的窗口过程函数的代码如下:

LRESULT CALLBACK OnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_QUIT:
        {
            printf("WM_QUIT\n");
            break;
        }
        case WM_CLOSE:
        {
            printf("WM_CLOSE\n");
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc(handle, message, wParam, lParam);
}

因此,除了将WM_MOVE消息发送到我的窗口或exit(0)WM_CLOSEcase块中使用外,如何确保在创建窗口后可以立即将其关闭?

新问题:

传递NULL到的hWnd参数后GetMessageW,而不是我的窗口句柄后,窗口现在正确关闭,因此回答了我之前的问题。

因此,为什么GetMessageW函数以前没有WM_QUIT使用提供的唯一窗口句柄来检索消息,而不是将其NULL用作hWnd参数?

雷米·勒博(Remy Lebeau)

一个适当的书面消息循环永远不会派遣一个WM_QUIT消息窗口过程中,什么时候会简单地打破循环GetMessage()返回0,它收到时WM_QUIT消息:

GetMessage函数

如果函数检索到WM_QUIT以外的消息,则返回值为非零。

如果该函数检索WM_QUIT消息,则返回值为零。

如果有错误,则返回值为-1。例如,如果hWnd是无效的窗口句柄或lpMsg是无效的指针,则该函数将失败。要获取扩展的错误信息,请调用GetLastError。

作为对的响应WM_CLOSE,您应该打电话DestroyWindow()而不是PostQuitMessage()直接打电话(的默认行为DefWindowProc(WM_CLOSE)DestroyWindow()为您打电话)。您需要一个WM_DESTROY处理程序,然后应调用PostQuitMessage()

LRESULT CALLBACK OnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CLOSE:
        {
            printf("WM_CLOSE\n");
            DestroyWindow(handle);
            return 0;
        }

        case WM_DESTROY:
        {
            printf("WM_DESTROY\n");
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc(handle, message, wParam, lParam);
}

这记录在MSDN上:

关闭窗户

这是该页面的流程图:

流程图

对于此GetMessage()问题,如果您仔细阅读文档GetMessage()PostQuitMessage()仔细阅读,将会看到WM_QUIT张贴消息PostQuitMessage()不是窗口消息。传递非NULLHWNDGetMessage()只会从中检索消息PostMessage()SendMessage()消息是针对该特定消息HWND 1的GetMessage()将会忽略任何非预期的消息HWND,其中包括来自和的线程消息传递一个NULL允许它返回任何未决的消息,其中包括PostThreadMessage()PostQuitMessage()HWNDGetMessage()WM_QUIT

1这样做很危险,顺便说一句:过滤窗口消息的危险

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Win32应用程序中的WinHttpReadData无法正常工作

来自分类Dev

在Win32控制台应用程序中显示弹出窗口

来自分类Dev

应用程序无法在Windows 2003中以Win32模式运行

来自分类Dev

无法在VS 2013,Windows 8.1中创建Win32控制台应用程序

来自分类Dev

应用程序无法在Windows 2000中以WIN32模式运行

来自分类Dev

应用程序无法在Windows 2003中以Win32模式运行

来自分类Dev

在Win32应用程序中连续运行代码

来自分类Dev

C#应用程序中的Win32异常

来自分类Dev

在窗口标题和消息框中显示错误的语言:Win32应用程序,opengl

来自分类Dev

关闭后,Win32应用程序仍在后台运行

来自分类Dev

如何在外部Win32应用程序的窗口上添加WPF覆盖?

来自分类Dev

Win32 API:打开对话框窗口后,应用程序冻结

来自分类Dev

应用程序无法从WinSxS加载Win32程序集

来自分类Dev

Win32应用程序。HBITMAP LoadImage无法加载任何内容

来自分类Dev

针对Win32 x64编译后,Electron应用程序将无法打开

来自分类Dev

Win32应用程序。HBITMAP LoadImage无法加载任何内容

来自分类Dev

无法使用GCC从MSDN编译Win32应用程序的示例

来自分类Dev

C Win32:窗口自动关闭

来自分类Dev

Win32窗口立即关闭

来自分类Dev

VS 2010中Win32应用程序中的文件夹复制

来自分类Dev

VS 2010中Win32应用程序中的文件夹复制

来自分类Dev

Win32应用程序中Visual Studio中的LNK2019错误?

来自分类Dev

从Win32应用程序运行外部exe

来自分类Dev

Boost.Asio Win32 Windows应用程序

来自分类Dev

Win32在应用程序内使用资源字体

来自分类Dev

在Win32应用程序中使用Windows窗体

来自分类Dev

LaunchFullTrustProcessForCurrentAppAsync 杀死 win32 应用程序

来自分类Dev

Visual Studio:“不是 Win32 应用程序”错误

来自分类Dev

如何获取Win32 C ++应用程序中单选按钮的状态?

Related 相关文章

  1. 1

    Win32应用程序中的WinHttpReadData无法正常工作

  2. 2

    在Win32控制台应用程序中显示弹出窗口

  3. 3

    应用程序无法在Windows 2003中以Win32模式运行

  4. 4

    无法在VS 2013,Windows 8.1中创建Win32控制台应用程序

  5. 5

    应用程序无法在Windows 2000中以WIN32模式运行

  6. 6

    应用程序无法在Windows 2003中以Win32模式运行

  7. 7

    在Win32应用程序中连续运行代码

  8. 8

    C#应用程序中的Win32异常

  9. 9

    在窗口标题和消息框中显示错误的语言:Win32应用程序,opengl

  10. 10

    关闭后,Win32应用程序仍在后台运行

  11. 11

    如何在外部Win32应用程序的窗口上添加WPF覆盖?

  12. 12

    Win32 API:打开对话框窗口后,应用程序冻结

  13. 13

    应用程序无法从WinSxS加载Win32程序集

  14. 14

    Win32应用程序。HBITMAP LoadImage无法加载任何内容

  15. 15

    针对Win32 x64编译后,Electron应用程序将无法打开

  16. 16

    Win32应用程序。HBITMAP LoadImage无法加载任何内容

  17. 17

    无法使用GCC从MSDN编译Win32应用程序的示例

  18. 18

    C Win32:窗口自动关闭

  19. 19

    Win32窗口立即关闭

  20. 20

    VS 2010中Win32应用程序中的文件夹复制

  21. 21

    VS 2010中Win32应用程序中的文件夹复制

  22. 22

    Win32应用程序中Visual Studio中的LNK2019错误?

  23. 23

    从Win32应用程序运行外部exe

  24. 24

    Boost.Asio Win32 Windows应用程序

  25. 25

    Win32在应用程序内使用资源字体

  26. 26

    在Win32应用程序中使用Windows窗体

  27. 27

    LaunchFullTrustProcessForCurrentAppAsync 杀死 win32 应用程序

  28. 28

    Visual Studio:“不是 Win32 应用程序”错误

  29. 29

    如何获取Win32 C ++应用程序中单选按钮的状态?

热门标签

归档