我有一个带有TTrayIcon
组件的应用程序,用于“隐藏”和“恢复”我的MainForm。这是我用来“隐藏”(OnTrayClick)
procedure TMainWindow.TrayIcon1Click(Sender: TObject);
var
I : Integer;
begin
if Application.MainForm.Visible then begin
{ Hide }
Application.MainForm.Visible := FALSE;
end else begin
{ Restore }
Application.MainForm.Visible := TRUE;
WindowState := wsNormal;
Application.BringToFront();
{ Workaround for ModalForms }
for I := 0 to Screen.FormCount-1 do begin
if (fsModal in Screen.Forms[I].FormState) then begin
Screen.Forms[I].BringToFront;
Screen.Forms[I].SetFocus;
break; // Stop looking for more ModalForms
end;
end;
end;
end;
如果没有其他(模态)表单打开,此示例可以正常工作。
但是如果有一个ModalForm打开并恢复我的MainForm,ModalForm似乎是在MainForm后面,我无法达到它。在恢复MainForm之后,如何激活/聚焦ModalForm并将其放在MainForm前面?我的Application.MainFormOnTaskbar
设置为False
编辑: 如果ModalForm已打开并且我恢复了我的MainForm,则两个表单都根本不会聚焦。
答案 0 :(得分:3)
MainFormOnTaskbar的设置似乎导致了问题。你真的需要保持这个设置为真。
如果有模态窗口,您可以选择不隐藏任何表单。在那种情况下检查Application.ModalLevel>隐藏代码中为0。您甚至可以显示一个气球提示,指出在消息关闭之前无法最小化应用程序。
否则,如果你真的想最小化所有窗口,下面的代码对我来说效果很好。隐藏打开窗口的全部,包括模态窗口。这将导致主任务栏图标消失,一切都在屏幕外。您需要做的一件事就是跟踪哪些窗口刚刚打开。我在下面通过在隐藏的表单上设置Tag值来做到这一点。然后在恢复代码中,您可以将这些窗口的可见性设置为true。
唯一没有处理的情况是隐藏主窗口但是让模态窗口可见。我不确定你为什么要这样做,而且我个人觉得这会让用户感到困惑。
procedure TForm1.TrayIcon1Click(Sender: TObject);
var
I : Integer;
begin
if Application.MainForm.Visible then
begin
// Hide
for I := 0 to Screen.FormCount-1 do
begin
if Screen.Forms[i].Visible = true then
begin
Screen.Forms[i].Visible := false;
Screen.Forms[i].Tag := 1;
end;
end;
end
else
begin
// Restore
for I := 0 to Screen.FormCount-1 do
begin
if Screen.Forms[i].Tag = 1 then
begin
Screen.Forms[i].Visible := true;
Screen.Forms[i].Tag := 0;
end;
end;
Application.BringToFront();
end;
end;
您可能需要将Modal Form上的PopupParent属性设置为主窗体。对于新表单,这设置为pmAuto,但如果这是一个旧项目,则可能是pmNone。
以下是Allen在PopupMode and PopupParent上发布的博客文章的链接,这是另一个解决主题问题的Stackoverflow问题Newly created modal window loses focus and become inacessible in Windows Vista
我通常使用这样的东西:
MyPopupForm := TMyForm.Create(Owner);
MyPopupForm.PopupMode := pmAuto;
MyPopupForm.PopupParent := Owner;
MyPopupForm.ShowModal;