Entwickler-Ecke

Windows API - Icon in der Schnelllstartleiste anlegen, aber wie?


del1312 - Mo 30.06.03 10:24
Titel: Icon in der Schnelllstartleiste anlegen, aber wie?
Ich ich möchte gerne nen Icon in der Schnellstartleiste von W2K anlegen wie mach ich das am besten?


hansa - Mo 30.06.03 10:52

hier ist alles drin, was Du brauchst, mußt es nur bei Dir richtig zusammensetzen :

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:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
procedure TForm1.FormCreate(Sender: TObject);
begin 
  // die noch notwendigen Zuordnungen
  NID.Wnd := self.Handle;
  NID.hIcon := Application.Icon.Handle;
  // "OnMinimize"-Event ändern
  Application.OnMinimize := MinimizeToTNA;
  Application.Minimize;
end;

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  // nur zur Sicherheit 
  Shell_NotifyIcon(NIM_DELETE,@NID); 
end

procedure TForm1.MinimizeToTNA(Sender: TObject); 
begin 
  // wenn das TNA-Symbol ezeugt werden konnte, ... 
  if(Shell_NotifyIcon(NIM_ADD,@NID)) then 
  // ... dann weg mit dem Taskbar-Button 
    ShowWindow(Application.Handle,SW_HIDE); 
end

procedure TForm1.WndProc(var Message: TMessage); 
begin 
  case Message.Msg of 
    WM_TRAYMSG:
      case Message.lParam of 
          WM_LBUTTONDOWN:
          begin
            // weg mit dem TNA-Symbol! 
            Shell_NotifyIcon(NIM_DELETE,@NID); 
            // den Taskbar-Button wieder anzeigen 
            // (egal, wie der Status von "Shell_NotifyIcon" ist) 
            ShowWindow(Application.Handle,SW_SHOW); 
            // und das hier auch noch, um die Anwendung 
            // zu aktivieren und ggf. in den Vordergrund 
            // zu holen
            Application.Restore; 
          end
      end
    else
      inherited WndProc(Message); 
  end
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  ShowWindow(GetWindow(Handle, GW_OWNER), SW_HIDE);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Application.OnClose := MinimizeToTNA;
  Application.Close;
end;


del1312 - Mo 30.06.03 11:10

vielen dank ich schau es mir gleich mal an :D


hansa - Mo 30.06.03 11:13

langsam, es fehlt noch folgende Deklaration, sonst geht es sowieso nicht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
implementation

{$R *.dfm}

const 
  WM_TRAYMSG = WM_USER + 10
var 
  NID : TNotifyIconData = ( 
    cbsize           : sizeof(TNotifyIconData);
    uID              : 0;
    uFlags           : NIF_MESSAGE or NIF_ICON or NIF_TIP;
    uCallbackMessage : WM_TRAYMSG;
    szTip            : '';
  );


Delete - Mo 30.06.03 11:13

Die Schnellstartleiste ist der Bereich rechts neben den Startbutton. Der Code von Hansa ist aber für eine Icon in der TNA, dem Bereich bei der Uhr!


hansa - Mo 30.06.03 11:19

Da hat Luckie Recht. Also Achtung, habe das falsch verstanden. Vielleicht reicht es trotzdem. Mit dem Bereich links kann ich leider nicht dienen.


UGrohne - Mo 30.06.03 11:26

Da gibts nen Ordner dafür:
Dokumente und Einstellungen\[Benutzername]\Anwendungsdaten\Microsoft\Internet Explorer\Quick Launch

Musst jetzt nur noch den Profilpfad des Benutzers rauskriegen, aber die Frage war hier glaub ich schonmal :wink:


del1312 - Mo 30.06.03 11:32

ah alles klar, wie ich den pfad des users rausbekomme weiss ich ja nun schon :D noch ne kleine frage wie leg ich da ne verknüpfung an?


Tino - Mo 30.06.03 11:56

ecspooky hat folgendes geschrieben:
wie leg ich da ne verknüpfung an?

Da reicht ein Blick in die FAQ: ...eine Dateiverknüpfung (*.lnk) erstellen? [http://www.delphi-forum.de/viewtopic.php?t=877]

Gruß
Tino


ddcool - Mi 09.07.03 17:06

Ich hab hier eine einfache Lösung!

geh mal auf http://www.delphi32.com/vcl/5086/download,xid,5086.asp und lade dir das Zip runter. Danach öffnest du die "CoolTrayIcon_D5" oder die "CoolTrayIcon_D6plus" mit Delphi und Installiert die Komponente einfach.
Nun hast du in der Koponentenleiste einen neuen Eintrag und fertig!
Nur noch die Komponente ins Project einfügen und entsprechend bearbeiten.

greez Basti


Delete - Mi 09.07.03 17:21

Hallo? Es geht um die QuickLaunchbar rechts neben dem Startbutton. Der Name der Komponente läßt aber daraufschließen, dass die Komponente ein Icon in der TNA, dem Bereich neben der Uhr, erzeugt.

Rechtsschreibfehler ausgebügelt.


Delete - Mi 09.07.03 18:38

@Luckie: :)

Ich will aber mal was hierzu sagen:
UGrohne hat folgendes geschrieben:
Da gibts nen Ordner dafür:
Dokumente und Einstellungen\[Benutzername]\Anwendungsdaten\Microsoft\Internet Explorer\Quick Launch

Musst jetzt nur noch den Profilpfad des Benutzers rauskriegen

Das funktioniert nur auf NT-Systemen (speziell wohl 2000 und XP). Wenn das Programm aber veröffentlicht werden und als Feature diesen Link in der Schnellstartleiste erstellen soll, dann geht das unter 9x in die Hose. Hier steckt der Schnellstartordner nämlich unter dem Windows-Verzeichnis.

Ich empfehle daher den Einsatz einer Shell-Funktion (etwa SHGetSpecialFolderPath, und Co.), mit der man den Pfad von bestimmten Ordnern ermitteln kann. Die dafür notwendige Shell-Konstante lautet übrigens CSIDL_APPDATA und entspricht dem Ordner

Quelltext
1:
Laufwerk:\Pfad\...\Anwendungsdaten                    

(oder die englischen Entsprechungen auf einem englischen Windows). An diesen ermittelten Teil muss man demnach nur noch

Quelltext
1:
Microsoft\Internet Explorer\Quick Launch                    

anhängen, und man ist (relativ unabhängig von der laufenden Windows-Version) am richtigen Ort!

Nachtrag: ...wie kann ich spezielle Ordner finden? [http://www.delphi-forum.de/viewtopic.php?t=9428]; als Anregung, wie man die Shellfunktionen nutzt. - Und mit Bestürzung habe ich festgestellt, dass es das schon mal gab: Systemordner [http://www.delphi-forum.de/viewtopic.php?t=6392]. Erschreckend, diese Suchfunktion. :mrgreen: