加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 当用户单击任务栏按钮时,为什么模态Delphi表单不接收

发布时间:2020-12-14 02:54:55 所属栏目:Windows 来源:网络整理
导读:在 Windows 8.1上运行的Delphi(2007)程序中,我希望在用户单击属于我的程序的任务栏按钮时收到通知.所以我正在捕获WM_SYSCOMMAND,在这种情况下通常会发送. 这适用于程序的主窗口. 如果模态窗口处于活动状态(使用Form2.ShowModal打开),则相同的代码无法捕获WM_
在 Windows 8.1上运行的Delphi(2007)程序中,我希望在用户单击属于我的程序的任务栏按钮时收到通知.所以我正在捕获WM_SYSCOMMAND,在这种情况下通常会发送.

这适用于程序的主窗口.

如果模态窗口处于活动状态(使用Form2.ShowModal打开),则相同的代码无法捕获WM_SYSCOMMAND,无论是在main for还是在modeal形式中.有什么不同吗?有没有办法改变这个?

这是我添加到两种形式的代码:

unit unit1;

interface

type
  TForm1 = class(TForm)
    // [...]
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  end;

 // [...]

implementation

 // [...]

procedure Tf_dzProgressTest.WMSysCommand(var Msg: TWMSysCommand);
begin
  inherited; // place breakpoint here
end;

 // [...]

end.

我还尝试使用Application.OnMessage或TApplicationEvents组件,甚至覆盖表单的WndProc方法.当模态窗体处于活动状态时,它们都不能捕获WM_SYSCOMMAND.

解决方法

单击任务栏按钮时,系统会尝试对与任务栏按钮关联的窗口执行最小化操作.通常,这是主窗体的窗口.这就是WM_SYSCOMMAND的起源.

现在,当显示模式窗体时,将禁用主窗体.通过调用Win32 EnableWindow函数禁用它.这是模态的一个组成部分.模态窗口是唯一启用的顶级窗口,因为您不应该与任何其他顶级窗口进行交互.

禁用窗口时,其系统菜单也会被禁用.这就是为什么系统无法执行最小化操作,以及为什么您不接收WM_SYSCOMMAND.

你可以做很多事情.显示模态窗体后,必须禁用主窗口.并且在那时它不会接收WM_SYSCOMMAND并且不会发现用户单击任务栏按钮.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读