类似SendToBack for TApplication的东西

时间:2013-12-12 13:42:04

标签: forms delphi z-order

大家好日子!

我想在我的应用程序中模拟不同形式的作品作为不同的程序 所有表单在TaskBar上都有自己的按钮,app的mainform是不可见的,Application.ShowMainForm:= false。

但是如果我显示两个表单,然后打开一些覆盖两个表单的程序,然后打开第一个表单(第二个表单在某个程序后面),然后关闭第一个表单,第二个表单激活并在某个程序前恢复。

我明白它会恢复,因为在关闭第一个表单后我的应用程序保持活动状态,这就是显示第一个可见表单的原因。如何防止恢复第二种形式?我似乎需要在关闭后发送回我的应用程序,但我不知道如何。

  

@David Heffernan
  它实际上是Windows背后的所有这些。当你的一个   窗体关闭,Windows必须决定在哪里移动焦点。   它选择将其移动到您的过程中的另一个顶级窗口,   因为存在可见的。它通过发送窗口实现这一点   它选择WM_SETFOCUS消息。毫无疑问,你可以拦截这一点   并阻止它发生

我试图在我的窗口上拦截WM_SETFOCUS,但是没有这样的消息。

type
  TfMyForm = class(TForm)  
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FOldWindowProc: TWndMethod;
    procedure NewWindowProc(var Message: TMessage);
  end;

implementation

procedure TfMyForm.FormCreate(Sender: TObject);
begin
  FOldWindowProc := WindowProc;
  WindowProc := NewWindowProc;
end;

procedure TfMyForm.NewWindowProc(var Message: TMessage);
begin
  if Message.Msg = WM_SETFOCUS then
    Beep;
  FOldWindowProc(Message);
end;

1 个答案:

答案 0 :(得分:4)

这是我找到的解决方案。

procedure SwitchToPreviousWindow(AHandle: HWND);
var PrevWindow: HWND;
begin
  PrevWindow := GetNextWindow(AHandle, GW_HWNDNEXT);
  while PrevWindow <> NULL do
  begin
    if IsWindowVisible(PrevWindow) then
    begin
      SetForegroundWindow(PrevWindow);
      Exit;
    end;
    PrevWindow := GetNextWindow(PrevWindow, GW_HWNDNEXT);
  end;
end;

procedure TfMyForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  SwitchToPreviousWindow(Self.Handle);
end;