检测 Windows 关闭或应用程序是否尝试从系统菜单关闭 (WM_CLOSE)

2023-11-22

我正在使用托盘应用程序。

Onj FormCloseQuery 我检查程序是否应该转到托盘,而不是关闭它,而是将其放入托盘中(CanClose := False)

但是,如果 Windows 由于 Windows 关闭而尝试关闭我的应用程序,我不想将我的应用程序移至托盘中,而是将其关闭。

Win7 终止我的应用程序,但 XP 不会关闭,因为我的应用程序仍保留在托盘中。

如何检测 Windows 是否处于某种“关闭”模式?

Thanks!


If the OnCloseQuery事件被触发以响应WM_QUERYENDSESSION消息、设置CanClose=False会导致消息返回FALSE.

在 XP 及更早版本中,这将取消 Windows 关闭。到目前为止,任何已收到WM_QUERYENDSESSION消息将收到WM_ENDSESSION消息及其wParam值设置为FALSE告诉那些应用程序NOT终止自己。这就是为什么您的应用程序会进入托盘并且在 Windows 关闭期间不会退出。

Microsoft 在 Windows Vista 中更改了此行为,因此应用程序无法通过以下方式取消 Windows 关闭WM_QUERYENDSESSION不再了。这就是 Windows Vista 及更高版本将终止您的应用程序的原因。如果应用程序需要故意停止 Windows 关闭,则会引入一个全新的 API。

MSDN 上对此进行了记录:

Windows Vista 中的应用程序关闭更改

要执行您所要求的操作,您必须拦截WM_QUERYENDSESSION直接发送消息,以便您确定是否OnCloseQuery由于 Windows 关闭或非关闭而被调用。例如:

type
  TForm1 = class(TForm)
  private
    procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
    procedure WMEndSession(var Message: TWMEndSession); message WM_ENDSESSION;
  end;

var
  ShuttingDown: Boolean = False;

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
  ShuttingDown := True;
  inherited;
end;

procedure TForm1.WMEndSession(var Message: TWMEndSession);
begin
  ShuttingDown := Message.EndSession;
  inherited;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := ShuttingDown;
  if not ShuttingDown then
  begin
    // your Tray logic here ...
  end;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测 Windows 关闭或应用程序是否尝试从系统菜单关闭 (WM_CLOSE) 的相关文章

  • 如何将 JSON 字符串转换为图像?

    我有一个将图像转换为 JSON 数组的应用程序 并将其保存到 blob 字段中 function getImage String var memorystream TMemoryStream jsonArray TJSONArray beg
  • 从delphi应用程序调用.net4.0 com服务器后出现错误异常

    我们正在将代码库从 BDS2006 迁移到 Rad Studio XE 我们发现了一些非常奇怪的行为 如果我们在从 Net4 0 中实现的 COM 服务器创建一些对象后进行无效的浮点运算 即除以零 我们不会没有得到正常异常 即 EDivis
  • 如何追踪“地址 00000000”的访问违规

    我知道如何创建 map 文件来在错误消息包含实际地址时跟踪访问冲突错误 但是如果错误消息说怎么办 Access violation at address 00000000 Read of address 00000000 我从哪里开始寻找这
  • 查找Delphi项目中的所有编译错误

    我正在对我的 Delphi 项目进行一些重构 我希望能够做出改变 然后看看all项目中因该更改而中断的地方 类似于 Eclipse 列出项目的所有编译错误 在 Java 中 在 Delphi 中 我可以进行更改 然后重新编译我的项目 但编译
  • 如何释放 TInterfacedObject 中的 TObject 成员

    我知道接口对象是引用计数的 因此不需要手动释放它 但如果它有一个 TObject 继承成员 我是否应该在析构函数中手动释放该成员 考虑以下代码 program Project2 APPTYPE CONSOLE R res uses Syst
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • 防止多个实例 - 但还要处理命令行参数?

    我正在从我的应用程序处理与 Windows 相关的扩展文件 因此 当您在 Windows 中双击文件时 它将执行我的程序 然后我从那里处理该文件 如下所示 procedure TMainForm FormCreate Sender TObj
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf
  • 将图像加载到 TImageList 并读取它们?

    我试图通过将 jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中 从上到下的代码片段 Selectdir 有效 fileexists 部分有效 这用于加载文件夹中的所有图像 所有图像都以 0 jpg
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果
  • 如何在Delphi中将对象方法作为参数传递,然后调用它?

    我担心这可能是一个有点愚蠢的问题 但这让我很难过 我正在寻找将对象的方法传递到过程中的最简单的方法 以便过程可以调用对象的方法 例如 超时后 或者可能在不同的线程中 所以基本上我想 捕获对对象方法的引用 将该引用传递给过程 使用该引用 从过
  • Delphi - Indy - 保存 GMail 草稿

    我一直在 Delphi 下使用 Indy 通过 gmail 帐户发送消息 使用 TIdSMTP 和 TIdMessage 组件 这绝对没问题 但是 我的客户请求将消息保存到 DRAFTS 文件夹 以便他在实际发送消息之前对 以编程方式创建的
  • Delphi 7 - 处理表单中嵌入框架的 MouseWheel 事件?

    你好 我有一个表格 里面有几个框架 对于某些框架 我希望滚动内容 或至少处理鼠标滚轮事件 我已经尝试过以下方法 只需为每个帧分配一个 OnMouseWheel 事件处理程序 重写父窗体的 MouseWheel 事件 procedure TF
  • MainFormOnTaskbar + 工具提示导致焦点窃取

    我使用 Delphi XE2 构建了下面的代码 它创建 Form1 Form1 立即创建 Form2 的实例 当我按下 Form2 上的按钮时 会创建第二个 Form2 现在 如果我将鼠标悬停在第二个 最上面的 Form2 上的按钮上 并等
  • FireDac 添加下划线 1 以区分具有相同名称的 2 个列名

    我有一个连接 2 个表的选择 因此这些表中存在具有相似名称的列 因此现在在检索结果时 FireDac 将下划线 1 添加到第二个列名称以区分这两个表 Select from Table1 inner join Table2 on Table
  • 有用的 Delphi 代码模板

    我用 Delphi 编程已经两年多了 我大概只有 5 个自定义模板 我觉得我应该有更多 如果有人有任何特别有用的东西 那么在 stackoverflow 上有一个很好的存储库就太好了 我不在乎您使用的是 Delphi 2009 语法还是 D
  • (发件人:TObject)

    发件人 TObject 是什么意思 如 procedure TForm1 Button1Click Sender TObject var s Integer begin end Sender 是对触发事件的组件的引用 在这种情况下 Send
  • 如何修复这个 delphi 7 编译错误 - “重复资源”

    我正在尝试编译我继承的 Delphi 7 项目 但收到此错误 错误 警告 重复资源 错误 类型 2 位图 ID 编辑 错误 文件 C 路径缩短 common CRGrid res 资源已保留 文件 c common raptree RES
  • 在 Delphi 中将对象转换为 OleVariant

    有没有办法在 OleVariant 中传递包装并解开 TObject 后代 我正在尝试跨自动化对象传递 TObject 我知道这不是一个好主意 但我没有更好的选择 该对象将在来自同一自动化 dll 的对象之间传递 如果这有什么区别的话 像这
  • 在网格上拖动时拖动图像更改

    我正在 StartDrag 上创建自定义 DragObject 的实例 procedure TForm1 GridStartDrag Sender TObject var DragObject TDragObject begin DragO

随机推荐

  • 使用 Rails 3 中的表单按钮覆盖 respond_to 格式

    我有一组使用 Rails 调用 respond to 以各种格式显示的报告 这样如果 URL 以 CSV 或 JSON 结尾 则报告将以该格式生成 我请求制作一个下载按钮 以便更轻松地获取报告 但由于报告具有日期范围等自定义功能 因此我需要
  • Firebase 时间戳至今的日期和时间

    我正在使用 firebase 作为我的聊天应用程序 在聊天对象中 我使用添加时间戳Firebase ServerValue TIMESTAMP method 我需要使用此时间戳在我的聊天应用程序中显示消息接收时间 如果是当前时间 我只需要显
  • Android ActionBarSherlock 顶部栏

    我想要一个像 foursquare 这样的操作栏 我想要的是诸如朋友 探索和我 另外 在选项卡上方 我想要一个自定义布局 其中包括一些按钮 例如foursquare 徽标 刷新和签入在四方 我创建了选项卡 但无法更改 ActionBarSh
  • UILocalNotification 的警报操作代码

    UILocalNotification notif cls alloc init notif fireDate self datePicker date notif timeZone NSTimeZone defaultTimeZone n
  • Java 忽略类路径

    我正在编写一个使用 Oracle JDBC 驱动程序的 java 程序 我已将其设置在我的类路径中 当我在 IDE 中运行程序 作为 jdbc 添加为库 时 程序运行良好 当我尝试部署它时 它完全忽略类路径中的列表并给我一个 NoClass
  • Docker build --no-cache 实际上会下载并刷新基础镜像吗?

    docker build no cache 刷新吗updated是否远程基础镜像 文档似乎没有具体说明 The no cache选项将重建图像而不使用本地缓存图层 但是 那FROM如果构建主机上存在已提取的基础映像 该行将重用该基础映像 来
  • 用 PHP 删除 GET 变量的好方法?

    我有一个包含 GET 变量的完整 URL 的字符串 删除 GET 变量的最佳方法是什么 有没有一种好方法可以只删除其中一个 这是一段可以工作但不是很漂亮的代码 我认为 current url explode current url echo
  • 2.5 的纯 Python 有理数模块

    有人见过这样的事情吗 小型自给自足的模块是首选 The 分数模块如有必要 可以从 2 6 中删除 获取fractions py numbers py 和abc py 所有纯Python模块 您可以从这里获取单个文件 2 6 分支 2 7 不
  • 在默认的 joomla 3.1.1 注册表单中添加自定义字段

    最近我偶然发现一个情况Joomla 3 1 1我需要添加一个附有默认注册表单的自定义字段 我浏览了现有的资源 这些资源表明我应该导航到joomla root components com users models forms registr
  • 如何将多个中间件功能封装成一个?

    我有许多类似于以下的中间件功能 function validate req res next req validationError new Error invalid function checkValid req res next if
  • 配置 Tomcat 以利用浏览器缓存?

    我运行谷歌的页面速度在我们的网络应用程序上分析和优化您的网站 下面的众多项目之一网络性能最佳实践如页面速度中列出的那样 为了在所有浏览器中充分利用缓存的一致优势 我们建议您将 Web 服务器配置为显式设置缓存标头并将其应用于所有可缓存静态资
  • PHP JSON 响应包含 HTML 标头

    我遇到了一个奇怪的问题 我正在尝试编写一个 PHP 页面 该页面将一些 JSON 返回到 Jquery AJAX 调用 问题是 尽管将内容类型设置为 application json 但响应似乎始终包含 HTML 标头 这是 PHP 代码
  • X f() 是什么意思?

    我看到这段代码 但不明白它的意思 我知道我们如何使用默认构造函数 但这不是默认构造函数 这是什么 class X int main X f 它声明了一个函数f它不带任何参数并返回一个类型X 这也称为最令人烦恼的解析在C 中 它是 C 标准定
  • Android - Activity 与 FragmentActivity? [复制]

    这个问题在这里已经有答案了 我是安卓新手 我想构建一个具有选项卡格式的应用程序 我找到了很多文档Activity已经用过 也在很多情况下使用过FragmentActivity 我不确定哪个会更好开始 请建议我应该使用Activity or
  • 如何修复“必须为自定义运行时设置 --custom_entrypoint 标志”?

    当我运行时 我在 appengine 上收到此错误gcloud preview app run app yaml The custom entrypoint flag must be set for custom runtimes My a
  • Jupyter 命令仅适用于破折号(例如 jupyter-kernelspec 而不是 jupyter kernelspec)

    我将 Jupyter 与 Anaconda3 一起使用 My Anaconda3 and Anaconda3 Scripts 文件夹已添加到 PATH 多变的 尽管jupyter exe在里面Scripts上面的文件夹中 Jupyter 相
  • 是否可以将结构变量作为函数参数传递而不预先定义它?

    我有两个这样定义的结构 在color h typedef struct rgb uint8 t r g b rgb typedef struct hsv float h s v hsv hsv rgb2hsv rgb color rgb h
  • jQuery 屏蔽输入插件。当文本框获得焦点时选择所有内容

    这是这个问题的后续问题 当文本框获得焦点时选择文本框的所有内容 Javascript 或 jQuery 基本上我将文本框与jQuery 屏蔽输入插件 编辑 链接可能不再指向相关版本 当屏蔽的输入文本框接收焦点时 我想选择该文本框的所有内容
  • 如何以编程方式禁用 Windows 10 平板电脑屏幕的边缘滑动手势?

    尝试以编程方式和手动方式在immersiveShell的EdgeUI下将DisableCharmsHint和DisableTLcorner的注册表修改为1 以禁用触摸屏滑动边缘 重新启动后没有任何反应 只是想禁用从边缘滑动以防止用户访问其他
  • 检测 Windows 关闭或应用程序是否尝试从系统菜单关闭 (WM_CLOSE)

    我正在使用托盘应用程序 Onj FormCloseQuery 我检查程序是否应该转到托盘 而不是关闭它 而是将其放入托盘中 CanClose False 但是 如果 Windows 由于 Windows 关闭而尝试关闭我的应用程序 我不想将