大家好日子!
我想在我的应用程序中模拟不同形式的作品作为不同的程序
所有表单在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;
答案 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;