我有以下问题:我们正在构建一个相当大的应用程序(win32,Delphi 6 Enterprise)。在应用程序的几个部分中,通常包含主窗口选择的详细信息的模态窗口被使用。
我们修改了WM_SYSCOMMAND消息的处理方式,以便如果窗口是模态的,则会向应用程序的主窗口发送SW_SHOWMINNOACTIVE消息。这将导致整个应用程序最小化,而不仅仅是模态窗体。
然而,在特定情况下会出现问题:如果调用窗口设置为全屏,则在恢复时,模态窗口将出现在(禁用的)最大化主窗口下方(似乎在Windows 7上发生)。
我的问题有两个:
首先,当应用程序不再恢复时,我似乎没有收到任何syscommand消息,因此我无法引入代码来恢复Z-Order,因为我不知道该放置在哪里。 其次,我认为,如果整个应用程序都被最小化,那么在任务栏中单击应用程序的按钮应该以相同的状态恢复它,而不是在其下方出现模态窗口。是否有修复的方法?
编辑:我们进行了一些额外的测试,发现我们实际上可以在主窗体的WM_ACTIVATE处理程序中检测到问题。在那个阶段,我们也可以识别模态窗口。然而,我找不到将其恢复到Z-Order顶部的方法。
编辑2:这是将模态窗体最小化时最小化应用程序的代码:
所有的表单都来源于那个表单。
我们修改了WM_SYSCOMMAND消息的处理方式,以便如果窗口是模态的,则会向应用程序的主窗口发送SW_SHOWMINNOACTIVE消息。这将导致整个应用程序最小化,而不仅仅是模态窗体。
然而,在特定情况下会出现问题:如果调用窗口设置为全屏,则在恢复时,模态窗口将出现在(禁用的)最大化主窗口下方(似乎在Windows 7上发生)。
我的问题有两个:
首先,当应用程序不再恢复时,我似乎没有收到任何syscommand消息,因此我无法引入代码来恢复Z-Order,因为我不知道该放置在哪里。 其次,我认为,如果整个应用程序都被最小化,那么在任务栏中单击应用程序的按钮应该以相同的状态恢复它,而不是在其下方出现模态窗口。是否有修复的方法?
编辑:我们进行了一些额外的测试,发现我们实际上可以在主窗体的WM_ACTIVATE处理程序中检测到问题。在那个阶段,我们也可以识别模态窗口。然而,我找不到将其恢复到Z-Order顶部的方法。
编辑2:这是将模态窗体最小化时最小化应用程序的代码:
procedure TfmGITForm.WMSysCommand(var Message: TWMSysCommand);
begin
if (fsModal in FormState) or
not Application.MainForm.Visible then
begin
case Message.CmdType of
SC_MINIMIZE:
begin
ShowWindow(Application.Handle, SW_SHOWMINNOACTIVE);
end;
SC_RESTORE:
begin
ShowWindow(Application.Handle, SW_SHOWNORMAL);
inherited;
end;
else
inherited;
end; // case
end
else
inherited;
end;
所有的表单都来源于那个表单。
SW_SHOWMINNOACTIVE
的作用吗?这样做是为了让模态窗体最小化时整个应用程序都被最小化吗?如果是的话,建议尝试调用Application.Minimize
。 - David Heffernancase Message.CmdType and $FFF0 of
。请参考WM_SYSCOMMAND中的注释。 - Sertac Akyuz