Entwickler-Ecke

Windows API - jedem Fenster sein Taskbareintrag...


firefuzy - Mi 04.06.08 14:38
Titel: jedem Fenster sein Taskbareintrag...
Hallo!

Ich schreibe gerade ein Programm, dessen Unterfenster alle einen Taskleisten-Eintrag erhalten sollen. Leider weiß ich allerdings nicht so recht wie man das realisieren muss. Ich war zunächst ziemlich erstaunt, dass man mit Google zu diesem Thema nicht sehr viel findet, obwohl ja eigentlich jedes Programm für seine Unterfenster einen Taskbareintrag anlegt (z.B. Firefox: Downloads, Add-Ons, Lesezeichen-Manager, etc. haben alle eigene Einträge). Vielleicht sehe ich aber auch den Wald vor lauter Bäumen nicht.

Um einen Taskbar hinzuzufügen habe ich das hier gefunden. Allerdings reagiert die Form dann nicht mehr auf Form.Close oder Form.Visible := false;

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm.CreateParams(Var params: TCreateParams);
begin
  inherited CreateParams( params );
  params.ExStyle := params.ExStyle or WS_EX_APPWINDOW;
  params.WndParent := GetDesktopwindow;
end;

Ich habe außerdem nichts gefunden, wie man den Eintrag beim schließen des Fensters wieder entfernt. Außerdem beendet sich die Anwendung durch obigen Code auch nicht mehr, wenn das Hauptfenster geschlossen wird.

Ich hoffe Ihr könnt mir weiterhelfen, sodass jedes Fenster einen Taskleisteneintrag bekommt, der wieder verschwindet, wenn man das Fenster schließt.

MfG firefuzy


nagel - Mi 04.06.08 17:20

Vielleicht hilft das hier [http://www.delphipraxis.net/topic102332.html].


Motzi - Mi 04.06.08 18:31

Lass die Zeile mit GetDesktopWindow weg, das sollte reichen...


firefuzy - Mo 09.06.08 21:26

Zitat:
Lass die Zeile mit GetDesktopWindow weg, das sollte reichen...

Das hat keinen sichtbaren Unterschied gebracht.


Delphi-Quelltext
1:
SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_APPWINDOW);                    

erstellt zwar einen Taskbareintrag, aber er verschwindet wieder sobald die Form minimiert wird, vielleicht weil die Mainform unsichtbar ist?

Außerdem hat die Mainform einen Taskbareintrag, auch wenn sie unsichtbar ist. Wie kann ich diesen entfernen?


firefuzy - Di 10.06.08 22:26

Sorry für den Doppelpost, aber ich kann einfach nicht vertehen, dass das so kompliziert ist.
Bei Visual Basic gibts einfach eine Property "ShowInTaskbar" die setzt man auf True und dann hat sich's! :roll:
Keine Verrenkungen mit extra Codezeilen um hinzubekommen, was doch eigentlich Standard sein dürfte.

Muss ich nur deshalb zu Visual Basic wechseln?

EDIT:

Weiß den wirklich niemand mehr weiter???


firefuzy - So 22.06.08 14:58

Halleluja ich habe endlich das gefunden was ich gesucht habe; danke Google Groups :flehan:

Für alle die auch versuchen, für jede Form einen Taskbareintrag/-button zu erzeugen hier der Link:
http://groups.google.com/group/borland.public.delphi.winapi/msg/85242b2f0e4b8a12


Kurz zusammengefasst muss man in der Mainform folgende Prozeduren einfügen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
Procedure TForm1.WMSyscommand(Var msg: TWmSysCommand); message WM_SYSCOMMAND;
[...]
Procedure TForm1.WMSyscommand(Var msg: TWmSysCommand);   
  Begin 
    Case (msg.cmdtype and $FFF0) of 
      SC_MINIMIZE: Begin 
          ShowWindow( handle, SW_MINIMIZE ); 
          msg.result := 0; 
        End;   
      SC_RESTORE: Begin 
          ShowWindow( handle, SW_RESTORE ); 
          msg.result := 0; 
        End;   
      Else 
        inherited; 
    End; 
  End; 

Procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowWindow( Application.handle, SW_HIDE ); 
  SetWindowLong( Application.handle, 
                 GWL_EXSTYLE, 
                 GetWindowLong( application.handle, GWL_EXSTYLE ) and 
                   not WS_EX_APPWINDOW or WS_EX_TOOLWINDOW); 
  ShowWindow( Application.handle, SW_SHOW );
end;


und folgende in jeder Form mit Taskbareintrag:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Procedure CreateParams( Var params: TCreateParams ); override;
[...]
Procedure TForm<Nummer der Form>.CreateParams( Var params: TCreateParams ); 
begin 
  inherited CreateParams( params ); 
  params.ExStyle := params.ExStyle  or WS_EX_APPWINDOW; 
end;


MfG
firefuzy