我想从 Windows 7 任务栏中隐藏一个应用程序。
我想在屏幕边缘做一个工具栏之类的东西,当用户点击它时它会做某些事情,但我不希望它显示在任务栏中,因为它是我想留在后台的东西.
我尝试了以下帖子中的说明,但它不适用于我的应用程序:
然后我在一个新的空 VCL 表单应用程序上尝试了它,它仍然无法正常工作。我搜索了其他解决方案,但它们的作用与链接帖子中的非常相似。
有什么改变,这使得在 Windows 7 中不可能吗?或者有什么你能想到的,可以阻止它工作?
我想从 Windows 7 任务栏中隐藏一个应用程序。
我想在屏幕边缘做一个工具栏之类的东西,当用户点击它时它会做某些事情,但我不希望它显示在任务栏中,因为它是我想留在后台的东西.
我尝试了以下帖子中的说明,但它不适用于我的应用程序:
然后我在一个新的空 VCL 表单应用程序上尝试了它,它仍然无法正常工作。我搜索了其他解决方案,但它们的作用与链接帖子中的非常相似。
有什么改变,这使得在 Windows 7 中不可能吗?或者有什么你能想到的,可以阻止它工作?
您可以覆盖主窗体CreateParam
以删除强制任务栏按钮 ( WS_EX_APPWINDOW
) 的标志,并另外使窗体归应用程序窗口所有。这与 shell 为窗口放置任务栏按钮的要求相反。来自“管理任务栏按钮”:
[..] 为确保窗口按钮位于任务栏上,请使用WS_EX_APPWINDOW扩展样式创建一个无主窗口。[..]
样本:
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
将“应用程序”的属性状态从其默认“真”更改。
您还可以删除第二行 (..WndParent := ..) 并在对象检查器PopupMode
中将表单设置为相同的效果。pmExplicit
顺便说一句,这是发布的解决方案TLama的同一主题的文档引用:
为了防止窗口按钮被放置在任务栏上,[...] 作为替代方案,您可以创建一个隐藏窗口,并使该隐藏窗口成为可见窗口的所有者。
当您设置MainFormOnTaskbar
为 false 时,主窗体由 VCL 设计的应用程序窗口拥有。如果您隐藏应用程序窗口,则满足要求。
尝试使用以下描述的棘手方法this article
:
在项目文件中将设置MainFormOnTaskBar
为 False。然后尝试从主窗体OnShow
和OnActivate
事件处理程序中隐藏应用程序窗口。所以你的项目可能如下所示:
项目1.dpr:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := False;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
单元1.pas:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
end.
您的应用程序主窗体通常在 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 标志,所以我想如果您对 toolwindow 标志不感兴趣,您可以省略以下部分
i OR WS_EX_TOOLWINDOW