Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在Windows7中从任务栏隐藏应用程序?_Delphi_Winapi_Delphi 2007_Taskbar - Fatal编程技术网

Delphi 如何在Windows7中从任务栏隐藏应用程序?

Delphi 如何在Windows7中从任务栏隐藏应用程序?,delphi,winapi,delphi-2007,taskbar,Delphi,Winapi,Delphi 2007,Taskbar,我想在Windows 7任务栏中隐藏应用程序 我想在屏幕边缘制作一个工具栏,当用户点击它时,它可以做某些事情,但我不想让它显示在任务栏上,因为我想把它放在后台 我尝试了以下帖子中的说明,但对我的应用程序无效: 然后,我在一个新的空VCL表单应用程序上尝试了它,但仍然不起作用。我搜索了其他的解决方案,但它们都与链接帖子中的非常相似 有什么改变了吗,这使得Windows7无法实现?或者你有什么要说的吗 你能想到,这可能会阻止它工作吗?尝试使用下面介绍的一种技巧: 在项目文件中将设置为False。然

我想在Windows 7任务栏中隐藏应用程序

我想在屏幕边缘制作一个工具栏,当用户点击它时,它可以做某些事情,但我不想让它显示在任务栏上,因为我想把它放在后台

我尝试了以下帖子中的说明,但对我的应用程序无效:

然后,我在一个新的空VCL表单应用程序上尝试了它,但仍然不起作用。我搜索了其他的解决方案,但它们都与链接帖子中的非常相似

有什么改变了吗,这使得Windows7无法实现?或者你有什么要说的吗
你能想到,这可能会阻止它工作吗?

尝试使用下面介绍的一种技巧:

在项目文件中将设置为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