2013-02-11 93 views
13

我想从Windows 7任务栏隐藏应用程序。如何在Windows 7中隐藏任务栏中的应用程序?

我想在屏幕边缘做一些东西,当用户点击它时会做某些事情,但我不希望它显示在任务栏中,因为它是我想要的东西留在后台。

我想在下面的帖子中的说明,但它并没有在我的应用程序中工作:

How to hide a taskbar entry but keep the window form

然后我试图在一个新的空VCL窗体应用程序,它仍然没有工作。我寻找其他的解决方案,但他们都像在链接文章中一样做。

有什么改变,这使得在Windows 7中不可能?还是有什么你可以想到的,这可以防止它的工作?

+0

什么是你Application.MainFormOnTaskBar属性的值? – jachguate 2013-02-11 16:56:31

+2

仅供参考壳牌的AppBar API是为此设计的http://msdn.microsoft.com/en-gb/library/windows/desktop/cc144177(v=vs.85).aspx/ http://stackoverflow.com/questions/75785/How-do-you-do-appbar-docking-to-screen-edge-like-winamp-in-wpf – 2013-02-11 18:48:33

+0

Application.MainFormOnTaskBar默认为true。当我将它设置为false时,我在任务栏中获得2个条目。一个用于exe本身,另一个用于主窗口。 – Marks 2013-02-12 08:18:47

回答

6

尝试使用this article描述一个取巧的办法:

设置MainFormOnTaskBar为False在你的项目文件。然后尝试从主窗体的OnShowOnActivate事件处理程序中隐藏应用程序窗口。因此,您的项目可能看起来像如下:

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. 
9

您可以覆盖主窗体的CreateParam到删除强制任务栏按钮(WS_EX_APPWINDOW)和通过应用程序窗口另外使拥有。这是做壳的要求放置窗口的任务栏按钮。从“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属性的状态,如果你使用这种方法。

您也可以删除第二行(..WndParent:= ..),而不是在对象检查器中将PopupMode的表格设置为pmExplicit,以达到同样的效果。


顺便说一句,这里是从同一主题的文档报价为解决TLama posted

为了防止窗口和按钮被放置在任务栏上,[...] 作为替代,您可以创建一个隐藏窗口,并将此隐藏窗口作为您可见窗口的所有者。

当您将MainFormOnTaskbar设置为false时,VCL设计将主窗体归于应用程序窗口。如果您隐藏了应用程序窗口,则需求已满足。

-1

您的应用程序主窗体通常在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 
+0

它不工作! – Ampere 2016-05-11 07:08:24

相关问题