gpt4 book ai didi

Delphi 2009 - 如果出现 MessageDlg,从任务栏关闭所有功能会停止处理?

转载 作者:行者123 更新时间:2023-12-03 19:45:22 27 4
gpt4 key购买 nike

在使用 MessageDlg 并尝试通过 关闭我的应用程序时,我注意到一个奇怪的行为。任务栏关闭所有/组命令 .

我的申请如下:

  • 有一个隐藏的主窗体除了处理一些 Windows 消息并将它们传递到子窗口(如有必要)之外什么都不做。
  • 每个子窗口都将其父窗口设置为桌面(以使其显示在任务栏上)。
  • 每个 child 都有一个 OnClose 事件,它会弹出一个 MessageDlg 来提示用户是否要保存他们的 session (如果有任何内容已经被修改)

  • 问题似乎是它会不断关闭任何未修改的窗口,但是,当它碰到一个已经被修改的窗口时,两件事中的一件会间歇性地发生:
  • 无论我是否选择“是/否”,关闭所有进程似乎都会在该特定窗口关闭后停止。
  • 对话框不显示,结果是 mrCancel。关闭此窗口后,关闭所有进程再次停止。

  • 我所做的更改是使用 WinAPI MessageBox代替 MessageDlg 的功能,这似乎确实解决了问题。但是,我真的很想知道为什么 MessageDlg 会这样?

    我最初的想法是当对话框在 Close All 中间启动时,操作系统可能正在向对话框发送 WM_CLOSE 消息,因为它在技术上是该组的一部分(这可以解释对话框不出现并且默认为 mrCancel,因为这个相当于按 X)。但是,这并不能解释为什么在我关闭对话框后,关闭所有进程不会继续关闭组中的任何其他窗口!

    对此有什么想法/想法吗?

    最佳答案

    Windows 不发送 WM_CLOSE到这些窗口的消息,它会发布 WM_SYSCOMMANDSC_CLOSE要求。这又导致发送 WM_CLOSE如果使用标准 Windows 消息框,则显示消息。如果 MessageDlg()而是使用函数,仅第一次发布 WM_SYSCOMMAND导致WM_CLOSE ,其他人没有。很难确定,但这可能与 DisableTaskWindows() 有关。和 EnableTaskWindows() VCL 用来“伪造”模式对话框的调用。如果将 Windows 函数替换为 Application.MessageBox() , 一个使用 DisableTaskWindows() 的包装器和 EnableTaskWindows() ,那么它也不起作用(IMO 支持这种推理)。

    关于Delphi 2009 - 如果出现 MessageDlg,从任务栏关闭所有功能会停止处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1881578/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com