Entwickler-Ecke
Windows API - Icon neben der Uhr
GruppeCN - Fr 01.11.02 16:34
Titel: Icon neben der Uhr
Hallo,
ich möchte gerne, dass mein Programm beim minimieren als Icon neben der Uhr erscheint. Ich habe es bis jetzt mit dem Code Probiert, aber der funktioniert nicht.
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: 58: 59:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellApi, AppEvnts;
const IC_CLICK = WM_APP + 201;
type TForm1 = class(TForm) ApplicationEvents1: TApplicationEvents; procedure ApplicationEvents1Minimize(Sender: TObject); private { Private-Deklarationen } procedure Systray(var sMsg: TMessage); message IC_CLICK; public { Public-Deklarationen } end;
var Form1: TForm1; NIM : TNotifyIconData;
implementation
{$R *.DFM}
procedure TForm1.Systray(var sMsg: TMessage); begin // Vorgang: Klick auf das Icon neben der Uhr und Anzeige der Anwendung inherited; if (sMsg.LParam = WM_LBUTTONDOWN) then begin Show; Shell_NotifyIcon(NIM_DELETE, @NIM); Application.Restore; //zeigt die Anwendung wieder an end; end;
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject); begin //Vorgang: Minimieren der Anwendung, Entfernung des Taskleisteneintrags //und Hinzufügen des Programmicons neben der Uhr Form1.FormStyle:=fsStayOnTop; Hide; with NIM do begin cbSize := SizeOf (nIM); Wnd := Handle; uID := 0; uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; uCallbackMessage := IC_CLICK; hIcon := Application.Icon.Handle; szTip := 'Test-Programm'; end; Shell_NotifyIcon(NIM_ADD, @NIM); end;
end. |
Delete - Fr 01.11.02 16:49
Es gibt bereits einen funktionierenden Code für dieses Problem in AUQ.de. Das weiß ich deshalb so genau, weil ich ihn gepostet habe. Für Peter2002, wenn ich mich recht erinnere.
Wenn du also die Suchfunktion ein wenig bemühst, müsstest du fündig werden und das Problem lösen können. Mit weniger Code-Zeilen überdies.
Gruß,
Mathias.
PS: Ich habe gerade festgestellt, dass die Suche ohne Umweg zum Ziel führt, wenn du als Suchbegriffe "TNA minimieren" benutzt und auch den Autor (Peter2002) angibst.
Das ist ja einfach ... :twisted:
Anonymous - Fr 01.11.02 19:07
Unabhängig der Antwort von Mathias hab ich deinen Code geprüft und keinen Fehler entdeckt. Wenn ich das Fenster minimiere, dann erscheint ein TrayIcon neben der Uhr. Wenn ich auf das Icon klicke, dann wird das Fenster wieder hergestellt. Wo ist also das Problem?
Delete - Sa 02.11.02 10:20
Unabhängig von der Aussage Popovs (:wink:) habe ich mir den Code nur kurz angesehen und stelle die Frage: Warum dies?
Quelltext
1: 2:
| Form1.FormStyle:=fsStayOnTop; // <-- ? Hide; // <-- ? |
Erstens sollte man -laut Hilfe- zur Laufzeit nicht den Fensterstil ändern. In dem Fall verstehe ich es sowieso nicht, weil das Fenster versteckt werden soll. Warum dann also "stay on top"?
Und zweitens wird das Verstecken der Form durch Delphi bzw. das System übernommen. Und zu "Hide" fällt mir doch glatt der Peter ein:
Peter2002 hat folgendes geschrieben: |
Wirklich nur ein kleiner unterschied, mit großer wirkung.
Ich habe das bisher mit Form1.hide und Form1.show gemacht.
Mit ShowWindow (...) klappts! |
Meine Anweisung in besagtem Beitrag sah nämlich nur so aus:
Quelltext
1: 2:
| if(Shell_NotifyIcon(NIM_ADD,@NID)) then ShowWindow(Application.Handle,SW_HIDE); |
Wenn ich mal raten soll, Popov: das Problem von GruppeCN wird wohl das gleiche sein, das auch Peter hatte. Das Fenster ließ sich evtl. einmal minimieren und wiederherstellen, dann aber nicht mehr.
Ich weiß nicht, ob du es mehrfach ausprobiert hast?! Eine andere Erklärung hätte ich nicht, wenn du sagst, dass die Funktion ja eigentlich klappt.
Anonymous - Sa 02.11.02 18:34
Ich hab mir das ganze zuerst kurz angesehen und sah zuerst keinen Fehler. Alles stand mehr oder weniger an der richtigen Stelle. Mir ist zwar das StayOnTop und Hide auch aufgefallen, aber das hab ich ignoeriert, da es keine Auswirung auf den Prozes hatte. Ich persönlich hab das noch nie so gemacht, da ich überwiegend mit D3 arbeite und es dort keine ApplicationEvents Kompo gibt. Ich hätte wahrscheinlich auch auf das minimieren des Fensters reagiert. Allerdings bleibt bei minimieren des Fensters das Fenster weiterhin in der Taskleiste. Also hab ich das mit ApplicationEvents ausprobiert und es hat funktioniert. Auch hab ich das mehrmals hintereinander minimiert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!