【问题标题】:MessageBox not shown when opened processing WM_CLOSE from taskbar thumbnail close button从任务栏缩略图关闭按钮打开处理 WM_CLOSE 时未显示 MessageBox
【发布时间】:2011-02-24 02:05:14
【问题描述】:

尝试在 Windows 7 中尝试使用任务栏缩略图中的关闭按钮关闭窗口时显示“是否要保存”对话框(启用了 aero peek)。

在处理 WM_CLOSE 时使用 MessageBox() 不起作用。在您将鼠标光标移到缩略图之外之前,MessageBox 不会显示,因此禁用了 aero peek。

许多应用程序都有这种错误行为,因此这可能是 Windows 7 中的设计缺陷,但对于某些程序(Word、记事本、Visual Studio ......)它可以工作,所以我想知道他们使用了什么技巧(或以编程方式“退出”航空窥视模式需要什么)。

Windows 7 附带的小型“录音机”应用程序也有同样的问题(如果您录制的内容没有保存并尝试使用缩略图关闭按钮将其关闭)...

【问题讨论】:

    标签: c++ windows winapi windows-7 aero-peek


    【解决方案1】:

    我整理了一个小应用程序来重现这个问题。在调用 MessageBox 之前,我可以通过调用 SetForegroundWindow 来成功显示消息框。

    case WM_SYSCOMMAND:
        if (wParam == SC_CLOSE)
        {
            SetForegroundWindow(hWnd);
            MessageBox(hWnd, L"Are you sure you want to exit", L"Close Window", MB_OK);
        }
        else
        {
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    

    【讨论】:

      【解决方案2】:

      我将为WM_SYSCOMMAND 实现一个处理程序,并让 SC_CLOSE 行为发布一条应用程序定义的消息,该消息将显示您的 UI,并在用户想要退出时将 WM_CLOSE 发布到原始窗口。

      另外,记事本似乎使用task dialog,而不是消息框。你试过吗?

      【讨论】:

      • 试过了,但结果相同,在您移动鼠标指针之前不会显示消息框,因此 aero peek 退出...并且根据 MSDN 文档,“应用程序可以提示用户确认,之前通过处理 WM_CLOSE 消息并仅在用户确认选择时调用 DestroyWindow 函数来销毁窗口。"
      猜你喜欢
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2020-07-16
      • 2015-09-21
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多