我使用Delphi XE2编写了下面的代码。它创建了Form1,并立即创建了一个Form2实例。当我按下Form2上的按钮时,会创建第二个Form2。
现在,如果我将鼠标悬停在第二个最上层的Form2上,并等待工具提示出现,工具提示出现的瞬间,第一个Form2就会置于最前面,窃取焦点。
该问题仅在
我想了解为什么会发生这种情况。我已经了解到Delphi的Application对象处理了许多事情,包括提示显示,并且我知道Delphi可以在初始化期间重新创建窗口句柄,但我还没有能够深入探究以上行为的原因(或者以上两个事实是否相关)。 Project1.dpr
现在,如果我将鼠标悬停在第二个最上层的Form2上,并等待工具提示出现,工具提示出现的瞬间,第一个Form2就会置于最前面,窃取焦点。
该问题仅在
Application.MainFormOnTaskbar
为True
时发生。这还依赖于第一个Form2是从Form1的FormCreate
方法创建的。如果我使用PostMessage()
来延迟第一个Form2的创建直到应用程序完成初始化,问题就会消失。我想了解为什么会发生这种情况。我已经了解到Delphi的Application对象处理了许多事情,包括提示显示,并且我知道Delphi可以在初始化期间重新创建窗口句柄,但我还没有能够深入探究以上行为的原因(或者以上两个事实是否相关)。 Project1.dpr
program Project1;
uses
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True; // False makes problem go away
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Unit1.pas
unit Unit1;
interface
uses
Vcl.Forms, Unit2;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
public
procedure CreateForm2;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateForm2;
end;
procedure TForm1.CreateForm2;
var
frm : TForm2;
begin
frm := TForm2.Create(Application); // (Could pass Self - makes no difference)
frm.Show;
end;
end.
Unit2.pas
unit Unit2;
interface
uses
Vcl.Forms, System.Classes, Vcl.Controls, Vcl.StdCtrls, WinApi.Windows;
type
TForm2 = class(TForm)
Button1: TButton; // This button has a hint
procedure Button1Click(Sender: TObject);
end;
var
Form2: TForm2;
implementation
uses
System.SysUtils, Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.CreateForm2;
end;
end.
0
是正确的选择。通过WndParent
来控制也是一个明智的举动。至于GetDesktopWindow
,Raymond是正确的。Peter Below只是犯了许多人都会犯的错误,就是Raymond所描述的那个错误。 - David Heffernan