2013-02-11 28 views
13

Chciałbym ukryć aplikację z paska zadań systemu Windows 7.Jak ukryć aplikację na pasku zadań w systemie Windows 7?

Chcę zrobić coś na kształt paska narzędziowego na krawędzi ekranu, który wykonuje pewne czynności, gdy użytkownik go kliknie, ale nie chcę, aby był wyświetlany na pasku zadań, ponieważ jest to rzecz, którą chcę pozostać w tle.

Próbowałem z instrukcjami zawartymi w następnym poście, ale to nie działa na mojej aplikacji:

How to hide a taskbar entry but keep the window form

Potem próbowałem go na nowym pustym VCL Forms Application i nadal nie działa. Szukałem innych rozwiązań, ale wszystkie działają tak samo, jak w połączonym poście.

Czy coś się zmieniło, co uniemożliwia w Windows 7? A może jest coś, o czym mógłbyś pomyśleć, aby zapobiec jego działaniu?

+0

Jaka jest wartość nieruchomości Application.MainFormOnTaskBar? – jachguate

+2

FYI API AppBar Shell'a jest przeznaczone dla tego 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 –

+0

Domyślnie Application.MainFormOnTaskBar ma wartość true. Kiedy ustawię go na false, dostaję 2 wpisy na pasku zadań. Jeden dla samego exe, a drugi dla głównego okna. – Marks

Odpowiedz

6

Spróbuj użyć trudną drogę opisaną w this article:

Ustaw MainFormOnTaskBar False w pliku projektu. Następnie spróbuj ukryć okno aplikacji przed głównymi formularzami obsługi zdarzeń OnShow i OnActivate. Więc projekt może wyglądać następująco:

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

Można zastąpić główną formą na CreateParam do usuń flagę, która wymusza przycisk paska zadań (WS_EX_APPWINDOW) i dodatkowo spraw, aby formularz był w posiadaniu aplikacji. To robi naprzeciwko wymaganie, aby powłoka umieściła przycisk paska zadań dla okna. Od „Managing Taskbar Buttons”:

[..] W celu zapewnienia, że ​​przycisk okno jest umieszczone na pasku zadań, należy utworzyć pozostawiony okno z WS_EX_APPWINDOW rozszerzonym stylu. [..]

Próbka:

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; 

Nie zmienia stanu MainFormOnTaskbar własność 'wniosek' z domyślnej 'true' jeśli używasz tej metody.

Można również usunąć drugą linię (.. WndParent: = ..), a zamiast tego ustawić PopupMode formularza na pmExplicit w inspektorze obiektów, aby uzyskać taki sam efekt.


BTW, oto cytat z dokumentacji tego samego tematu na rozwiązanie TLama posted:

Aby zapobiec przycisku okna z wprowadzeniem na pasku zadań [...] Jako alternatywa, możesz utworzyć ukryte okno i uczynić to ukryte okno właścicielowi swojego widocznego okna.

Po ustawieniu wartości MainFormOnTaskbar na wartość false główny formularz jest własnością okna aplikacji według projektu VCL. A jeśli ukryjesz okno aplikacji, wymóg jest spełniony.

-1

Twój główny formularz wniosku jest zwykle tworzony w dpr, więc otwórz dpr i poszukaj linii, która tworzy główny formularz.

// 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); 

Wiem, że działa na XP i 7. Zgaduję, że jest dobre także dla 8. to dodaje okno flagę narzędzia i usuwa appwindow flagę więc myślę, że jeśli nie jesteś zainteresowany flaga toolwindow można pominąć następujące części

i OR WS_EX_TOOLWINDOW 
+0

To nie działa! – Ampere

Powiązane problemy