0

我有一个带有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,那么这两个表单都不会集中。

4

1 回答 1

4

MainFormOnTaskbar 的设置似乎导致了问题。你真的需要保持这个设置为真。

如果有模态窗口,您可以选择不隐藏任何表单。在这种情况下,请检查隐藏代码中的 Application.ModalLevel > 0。您甚至可以显示一个气球提示,说明在关闭消息之前无法最小化应用程序。

否则,如果您真的想最小化所有窗口,下面的代码对我来说效果很好。隐藏所有打开的窗口,包括模态窗口。这将导致主任务栏图标消失,一切都在屏幕外。您需要做的一件事是跟踪哪些窗口刚刚打开。我通过在刚刚隐藏的表单上设置标签值来做到这一点。然后在恢复代码中,您可以将这些窗口的可见性设置回真。

唯一不处理的情况是隐藏主窗口但让模态窗口可见。我不确定您为什么要这样做,而且我个人会觉得作为用户感到困惑。

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 和 PopupParent的博客文章的链接,这是另一个 Stackoverflow 问题,解决了该主题新创建的模式窗口失去焦点并在 Windows Vista 中变得无法访问

我通常使用这样的东西:

MyPopupForm := TMyForm.Create(Owner);
MyPopupForm.PopupMode := pmAuto;
MyPopupForm.PopupParent := Owner;
MyPopupForm.ShowModal;
于 2013-08-08T18:09:16.030 回答