我使用德尔福2010年建立一个Win32 GUI应用程序在Windows XP/Vista和Windows 7上运行开关Application.Mainform并调用MainformOnTaskBar原因闪烁Windows任务栏
基本上,Application.MainForm是只读属性,不能在运行时,一旦经由Application.CreateForm创建的第一个形式被改变:
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
上面的例子将使Form1中作为应用程序的MainForm中。它将在Windows 7任务栏的缩略图预览中显示。
在运行时将Application.MainFormOnTaskBar设置为true可让我们享受Windows aero主题功能。
我需要在运行时切换应用程序的mainform。例如,将Form2设置为主窗体。我用下面的代码,使其工作:
procedure SetAsMainForm(aForm:TForm);
var
P:Pointer;
begin
Application.MainFormOnTaskBar := False;
try
P := @Application.Mainform;
Pointer(P^) := aForm;
aForm.Show;
finally
Application.MainFormOnTaskBar := True;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetAsMainForm(Form2);
end;
执行Button1.Click将窗体2为MainForm,然后更新Windows的任务栏缩略图预览。但是,任务栏可能会闪烁开关。
我的问题是:
- 有什么办法走这样的闪烁?
- 设置Application.MainformOnTaskBar:False是否安全并在运行时再次将其设置为True?
此外,您也可以在它们之间建立两个不同的过程和交换数据。这当然有点贵,如果你不得不分享数据,这可能并不理想。 – 2010-11-09 15:22:34
这将是阻止任务栏闪烁,@Jens的反义词。任务栏将来自同一进程的按钮分组,这就是为什么Chau的代码似乎将一个按钮替换为另一个按钮 - 它们占据了任务栏上的相同位置。但是,如果按钮属于两个不同的进程,那么任务栏不会将它们放在一起。你不仅有闪烁的按钮,而且有从一个地方跳到另一个地方的按钮。 – 2010-11-09 15:29:30
取决于它们是否应该同时可见,以及它们是否足够分离两个不同的可执行文件。问题是为什么Chau需要改变主要形式呢?我在猜测,使用两个相同的可执行程序甚至两个不同的进程可能是一个更好的主意。 – 2010-11-09 15:34:46