如何通过API退出Win32应用程序?

2024-05-11

我有一个使用 Win32 API 编写的 C++ Win32 应用程序,我希望强制它在其中一个函数中退出。有没有类似的东西Exit() or Destroy() or Abort()类似的东西会终止它吗?


哎呀呀呀呀呀呀。不要做任何这些事情!

  • exit() 和 ExitProcess 相当于拿把枪朝进程的脸射击。我希望我不必解释为什么这不好,特别是对于保存共享对象(例如可能是系统范围的数据库句柄)的进程。我知道这是 Android 中的常态,但这是 Windows,我们在这里不这样做。

  • 直接调用PostQuitMessage()可能会导致内存泄漏。PostQuitMessage() 旨在从 WM_DESTROY 调用。它不是一条旨在用于要求关闭窗口的消息。它是应用程序将其退出代码发布回 shell 的回调机制。它的目的是用应用程序退出代码填充 WM_QUIT。如果你直接调用PostQuitMessage(),你将完全绕过WM_DESTROY。这是有问题的,因为许多窗口和子窗口部件都非常正确在 WM_DESTROY 中执行清理工作。 http://blogs.msdn.com/b/oldnewthing/archive/2005/07/26/443384.aspx如果您通过向窗口撒谎来跳过此消息,您将拒绝组件进行清理的机会。

  • 既然我们谈到了这个话题,也不要直接调用 WM_DESTROY。Microsoft 的 Raymond Chen 有一篇精彩的文章,他在其中解释了“向窗口发送 WM_DESTROY 消息就像恶作剧地打电话给冒充警察的人”。 http://blogs.msdn.com/b/oldnewthing/archive/2011/09/26/10216420.aspx它有点像 PostQuitMessage 的邪恶双胞胎。您不是在不进行清理的情况下退出,而是要求窗口在不退出的情况下进行清理。窗口管理器永远不知道要删除组件,并且内存中会留下一个死的孤立窗口。叹。

正确的答案是发布WM_CLOSE。使用默认窗口过程的任何内容都将正确通知窗口管理器销毁窗口,该窗口将按预期级联到 WM_DESTROY,然后级联到 WM_QUIT。

如果您需要与标准关闭不同的行为,另一种选择是创建 WM_USER 或 WM_APP 消息。如果您的窗口有一个“奇特的”WM_CLOSE——例如,您给用户一个提示“您确定要退出吗?”——并且您想跳过它,您可以使用 WM_USER 或定义一条自定义消息WM_APP 并在其位置调用它。您的应用程序定义的消息将实现默认的关闭行为,并且与系统小工具绑定的 WM_CLOSE 执行您的奇特行为。

我希望这有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过API退出Win32应用程序? 的相关文章

随机推荐

  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • 从 Ruby 运行 shell 命令:在显示输出时捕获输出?

    我有个问题 我想从另一个 ruby 脚本运行一个 ruby 脚本并捕获它的输出信息 同时让它也输出到屏幕上 runner usr bin env ruby print Enter your password password gets ch
  • Spring 的 LdapTemplate 搜索:PartialResultException:未处理的延续引用;剩余名称 '/'

    我通过 LDAP 为某个使用 spring 制作的应用程序添加用户 虽然这适用于大多数情况 但在某些情况下 它不起作用 检索我使用的用户 public class LdapUserServiceImpl implements ILdapUs
  • 用于将用户发送至设备应用商店上的应用评论页面的 URL

    为了将 iTunes App Store 置于最前面并打开它以显示应用程序的评论页面 要启动的 URL 是什么 我想将我的用户发送到 撰写评论 页面 其他一些 SO 答案提供了如下 URL 但它似乎不起作用 itms apps itunes
  • 如何在服务器上获取球衣日志?

    我正在使用球衣进行 REST WS 如何在服务器端启用球衣日志 很长的故事 我收到客户端异常 但我在 tomcat 日志中没有看到任何内容 它甚至没有到达我的方法 由于堆栈跟踪显示 toReturnValue 它确实从服务器获取了一些内容
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • JAAS keytab 配置的相对路径

    我有一个系统 其中 NET 客户端使用 Kerberos 针对 Java 服务器进行身份验证 一切正常 但我正在尝试改进服务器配置 目前一个keytab根目录中需要文件C 因为我的jaas配置文件看起来像这样 Server com sun
  • Elastic Beanstalk、Bundler 找不到 gem“bundler”的兼容版本

    我已经尝试过将 Elastic Beanstalk 用于 Rails 当我运行 eb deploy 时出现此错误 我需要至少安装bundler 1 8 4 知道如何解决这个问题吗 Bundler could not find compati
  • Angular2排序数组用于在html中的*ngFor中显示

    我正在循环浏览所有帖子 li 当显示每个帖子的日期时 我会执行以下操作 post date date yyyy MM dd HH mm ss 我想要做的是按最新的第一个顺序显示所有帖子 我尝试过使用类似的管道 li li import Pi
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac
  • 列表框:添加组合框作为项目?

    是否可以将列表框的每个项目都作为组合框 我需要这个 因为我将列表框设置为可检查 然后我需要让用户从列表中每个元素的不同选项中进行选择 Thanks 如果您不打算分发您的应用程序 那么您还可以查看 TreeView 控件 请参阅此示例 COD
  • 如何测试send_file烧瓶

    我有一个小型烧瓶应用程序 它需要上传一些图像并将它们转换为多页 tiff 没什么特别的 但是如何测试多个文件的上传和文件下载呢 我的测试客户端 class RestTestCase unittest TestCase def setUp s
  • CMake 中的 FindSDL2 发生了什么?

    我在游戏中使用 SDL2 我一直使用自定义 FindSDL2 cmake 因为标准 CMake 集中没有 然而 前段时间确实出现了有关 FindSDL2 的帖子 例子 红迪网帖子 https www reddit com r opengl
  • 捕获 SQLAlchemy 异常

    我可以使用什么捕获 SQLAlechmy 异常的上层异常 gt gt gt from sqlalchemy import exc gt gt gt dir exc ArgumentError CircularDependencyError
  • 从外部material-ui组件访问主题

    我有一个使用标准深色主题的主题提供商 我希望能够从我自己的自定义组件访问该主题的详细信息 但我不知道如何做到这一点 在下面的例子中 this props theme未定义 ReactDOM render
  • 在 LP2844Z(Zebra 打印机)上的收据中包含 PNG [重复]

    这个问题在这里已经有答案了 我正在致力于创建一个基于 HTML5 画布的签名 绘图框 目前我们在服务器上将画布保存为PNG 但可以轻松地将base64字符串保存在数据库中 现在的问题是我们如何在打印的收据上添加签名 目前我们使用 GF 字段
  • Pandas:如何删除以 nan 作为列名的多个列?

    根据标题 这是一个可重现的示例 raw data x this that this that this np nan np nan np nan np nan np nan np nan y np nan np nan np nan np
  • 为什么 as.character() 返回日期列表中的整数?

    我惊讶地发现 R 中出现以下行为 as character c Sys Date gt 1 2018 02 05 as character list Sys Date gt 1 17567 为什么会出现这种情况 也就是说 显然 17567
  • 如何在不显示父活动的情况下将一个全屏对话框片段替换为另一个全屏对话框片段?

    我有一个使用单个自定义 DialogFragment 类的活动 它的外观是数据驱动的 因此不同的调用看起来可能相当不同 它是 全屏 即 setStyle DialogFragment STYLE NO FRAME android R sty
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和