Delphi 如何在Windows7中从任务栏隐藏应用程序?
我想在Windows 7任务栏中隐藏应用程序 我想在屏幕边缘制作一个工具栏,当用户点击它时,它可以做某些事情,但我不想让它显示在任务栏上,因为我想把它放在后台 我尝试了以下帖子中的说明,但对我的应用程序无效: 然后,我在一个新的空VCL表单应用程序上尝试了它,但仍然不起作用。我搜索了其他的解决方案,但它们都与链接帖子中的非常相似 有什么改变了吗,这使得Windows7无法实现?或者你有什么要说的吗Delphi 如何在Windows7中从任务栏隐藏应用程序?,delphi,winapi,delphi-2007,taskbar,Delphi,Winapi,Delphi 2007,Taskbar,我想在Windows 7任务栏中隐藏应用程序 我想在屏幕边缘制作一个工具栏,当用户点击它时,它可以做某些事情,但我不想让它显示在任务栏上,因为我想把它放在后台 我尝试了以下帖子中的说明,但对我的应用程序无效: 然后,我在一个新的空VCL表单应用程序上尝试了它,但仍然不起作用。我搜索了其他的解决方案,但它们都与链接帖子中的非常相似 有什么改变了吗,这使得Windows7无法实现?或者你有什么要说的吗 你能想到,这可能会阻止它工作吗?尝试使用下面介绍的一种技巧: 在项目文件中将设置为False。然
你能想到,这可能会阻止它工作吗?尝试使用下面介绍的一种技巧: 在项目文件中将设置为False。然后尝试对主窗体和事件处理程序隐藏应用程序窗口。因此,您的项目可能如下所示: Project1.dpr: Unit1.pas:
您可以覆盖主窗体的
CreateParam
,以删除强制任务栏按钮的标志(WS_EX_APPWINDOW
),并使窗体归应用程序窗口所有。这与shell为窗口放置任务栏按钮的要求相反。从“”:
[…]为确保窗口按钮位于任务栏上,请创建一个
具有扩展样式的无主窗口。[……]
样本:
type
TForm1 = class(TForm)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle and not WS_EX_APPWINDOW;
Params.WndParent := Application.Handle;
end;
如果使用此方法,请不要将“应用程序”的MainFormOnTaskbar
属性的状态从其默认值“True”更改
您还可以删除第二行(…WndParent:=…),并在对象检查器中将窗体的PopupMode
设置为pmExplicit
,以达到相同效果
顺便说一句,以下是解决方案的同一主题的文档引用: 要防止窗口按钮被放置在任务栏上,[…] 或者,您可以创建一个隐藏窗口并将其隐藏 窗口可见窗口的所有者
当您将
MainFormOnTaskbar
设置为false时,主窗体由VCL design的应用程序窗口拥有。如果隐藏应用程序窗口,则满足要求。您的应用程序主窗体通常在dpr中创建,因此打开dpr并查找创建主窗体的行
// add this line first
// blank app title will prevent app from showing in the applications list in task manager
Application.Title := '';
// this line is already in the dpr and creates the main form, the class will differ
Application.CreateForm(TMainForm, Result);
// make the main form invisible to windows taskbar/task switcher
i := GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, i OR WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);
我知道这在XP和7上有效。我猜这对8个人也有好处。这将添加工具窗口标志并删除appwindow标志,因此我想如果您对工具窗口标志不感兴趣,可以省略以下部分
i OR WS_EX_TOOLWINDOW
Application.MainFormOnTaskBar属性的值是多少?仅供参考,Shell的AppBar API是为此而设计的/Application.MainFormOnTaskBar默认为true。当我将其设置为false时,任务栏中有2个条目。一个用于exe本身,一个用于主窗口。您可以执行
Application.ShowMainForm:=False代码>您应该真正添加SetWindowLong(Application.Handle,GWL_-EXSTYLE,(GetWindowLong(Application.Handle,GWL_-EXSTYLE)或WS_-EX_-TOOLWINDOW),而不是WS_-EX_-APPWINDOW);在最后一个Application.CreateForm之后。
// add this line first
// blank app title will prevent app from showing in the applications list in task manager
Application.Title := '';
// this line is already in the dpr and creates the main form, the class will differ
Application.CreateForm(TMainForm, Result);
// make the main form invisible to windows taskbar/task switcher
i := GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, i OR WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);
i OR WS_EX_TOOLWINDOW