我想隐藏Windows 7任务栏中的应用程序。
我想在屏幕边缘做一个类似工具栏的东西,当用户点击它时会做某些事情,但我不希望它显示在任务栏中,因为它是我要保留的东西在后台。
我尝试了以下帖子中的说明,但它对我的应用程序无效:
How to hide a taskbar entry but keep the window form
然后我在新的空VCL表单应用程序上尝试了它,它仍然无法正常工作。我搜索了其他解决方案,但它们都像链接的帖子一样做得非常相似。
有什么改变,这在Windows 7中是不可能的吗?或者你有什么 可以想到,这可能阻止它工作?
答案 0 :(得分:9)
您可以覆盖主窗体的CreateParam
以删除强制任务栏按钮(WS_EX_APPWINDOW
)的标志,并另外通过应用程序窗口使表单拥有。那就是要求shell为窗口放置任务栏按钮的相反。来自“Managing Taskbar Buttons”:
[..]要确保窗口按钮放在任务栏上,请创建一个 具有 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
属性的状态从其默认值“True”更改。
您还可以删除第二行(..WndParent:= ..),并将对象检查器中表单的PopupMode
设置为pmExplicit
,以达到同样的效果。
BTW,这是解决方案TLama posted的相同主题的文档引用:
为防止窗口按钮被放置在任务栏上,[...] 作为替代方案,您可以创建隐藏窗口并使其隐藏 窗口是可见窗口的所有者。
当您将MainFormOnTaskbar
设置为false时,主窗体由VCL设计由应用程序窗口拥有。如果您隐藏应用程序窗口,则满足要求。
答案 1 :(得分:8)
尝试使用this article
中描述的棘手方式:
在项目文件中将MainFormOnTaskBar
设置为False。然后尝试从主窗体的OnShow
和OnActivate
事件处理程序中隐藏应用程序窗口。所以你的项目可能如下所示:
的 Project1.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.
的 Unit1.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.
答案 2 :(得分:0)
您的应用程序主窗体通常在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