Entwickler-Ecke

Windows API - programm in tray minimieren


lippi - Di 21.01.03 14:17
Titel: programm in tray minimieren
hi, mich persönlich stört es wenn programme einfach nur minimiert sind... ich will mir ein programm schreiben dass sich in den systray neben der uhr plaziert mit einem icon.

ich habe jedoch keine ahnung wie ich das anstelle und habe mich gewundert das das noch niemand interessiert hat... die suchfunktion lieferte keine results.


falls einer den sourcecode dazu hat, bitte posten.
vielen dank im voraus!

an alle admin und member: DAS BOARD IST GENIAL!!!


Delete - Di 21.01.03 19:18

Such mal nach TNA hier im Forum.

Ja, auch du darfst sie benutzen. :roll:


Delete - Di 21.01.03 20:00

Er hat ja gesucht, Luckie. Schrieb er ja auch:
Zitat:
und habe mich gewundert das das noch niemand interessiert hat... die suchfunktion lieferte keine results.

Das erste stimmt zwar nicht, weil ich mich noch gut daran erinnere, dass irgendein Peter das wissen wollte ... allerdings hat er recht mit der zweiten Aussage: die Beiträge sind nicht zu finden.

Die Suchfunktion wird doch wohl kein Problem mit dem Jahreswechsel haben? :?


Delete - Di 21.01.03 20:13

Da stimmt was mit der Suchfunktion nicht. TNA muß vorkommen außer in diesem Thread.


Delete - Di 21.01.03 20:18

Hey, ich sollte langsam Geld verlangen - als lebendige Erweiterung der Suchmaschine. *stolz auf mein Gedächtnis*

MathiasSimmack hat folgendes geschrieben:
... weil ich mich noch gut daran erinnere, dass irgendein Peter das wissen wollte ...

Peter2002, war´s. Und hier ist der Beitrag: Prog. beim minimieren in die TNA? [http://www.delphi-forum.de/viewtopic.php?p=12412&highlight=#12412]

Besser gesagt: einer der vielen Beiträge, die sich mit der Taskbar Notification Area befassen.

Na, bin ich gut, oder was? 8)


Delete - Di 21.01.03 20:26

Und warum spuckt die Suche bei TNA nichts aus? :roll:


Delete - Di 21.01.03 20:43

Keine Ahnung. Ich wusste, wonach ich suchen musste.
Ich habe die entsprechende Frage bereits bei "Wünsche/Kritik" usw. gestellt.
Schau´n wir mal.


lippi - Di 21.01.03 23:03

bei mir funktioniert das auch mit der anderen source nicht!!! ich habe winxp kann das an dem liegen?
kennt einer das problem auch?


Delete - Di 21.01.03 23:09

Nein, ich kenne das Problem nicht (weil ich den Code geschrieben habe :)), und es liegt auch nicht an WinXP (weil ich´s dort ja auch probiert habe).

Wie wär´s, wenn du uns sagst, was nicht funktioniert und evtl. auch den Code postest. Oder vorher: noch mal genau schauen; vielleicht hast du nur was falsch abgeschrieben?


lippi - Mi 22.01.03 19:02

nein, es kommt keinen fehler oder sonst was aber sobald ich die form minimiere, geht das progy nicht in die TNA sondern in die taskbar wie wenn ich es normal minimieren würde....

kannst du mir nicht bitte deine dpr schicken? dann teste ich das mal obs dann geht, fehler in meiner source habe ich keine gefunden.
mailaddy wäre: xenion@userarea.ch


Delete - Mi 22.01.03 20:17

Wozu schicken?

Der Auszug aus meinem Code steckt in dem Beitrag, den ich oben gelinkt habe. Wenn du den übernimmst, geht´s (mit den Einschränkungen, die ich aber erwähnt habe).

Vom Schicken haben die anderen, interessierten Leser dieses Beitrags außerdem nichts.


ShadowCaster - Mo 07.04.03 13:04

hi Leute,

ich hab den Code von http://www.tipps.delphi-source.de/desktop/tut20020915-4.shtml mal ausprobiert.

Allerdings ist es so, dass wenn die Anwendung als Trayicon angezeigt wird und ich genau auf das eine Symbol meiner Anwendung klicke, ein Klick an alle Trayiconsymbole gesendet wird. Es gehen sämtliche Programme auf deren Symbole in der SysTray sind. :?:

Wo liegt da der Fehler im Quellcode oder ist da nur was vergessen worden? Ich nutze übrigens Win2000.


Delete - Mo 07.04.03 14:19

Das Beispiel von Delphi-Source ist vollständig und funktionstüchtig! Mangels Windows 2000 habe ich es eben mal unter 98 und XP getestet. Probleme gab es nicht.

Wenn es nicht ein grandioser Zufall war, dann könnte es eigentlich nur noch an Windows 2000 liegen. Auch wenn ich nicht wüsste, warum. Denn der Code ist eigentlich universell geschrieben und enthält, IMHO, keine potentiellen Bomben für irgend ein Betriebssystem.


ShadowCaster - Mo 07.04.03 14:24

schön zu wissen, dass es bei dir keine Probleme gab. Das interessierte mich leider nicht ;) Ich würde lieber wissen woran das liegt dass alle Anwendungen in der Systray dieses Ereignis erhalten, was sie sich starten öffnen.


Delete - Mo 07.04.03 14:31

ShadowCaster hat folgendes geschrieben:
schön zu wissen, dass es bei dir keine Probleme gab. Das interessierte mich leider nicht ;)

Sollte dich aber, da es zeigt, dass dieser Code druchaus korrekt arbeitet. Der Fehler ist also bei dir oder bei deinem Windows zu suche. Teste den Code doch mal auf einem anderen Rechner.


ShadowCaster - Mo 07.04.03 15:00

klar.. ich hab ja auch 10 Rechner mit allen denkbaren Plattformen zum Testen... :? Hab zu Hause noch ein XP2002 Rechner. Mal schauen.


Delete - Mo 07.04.03 18:35

Dann haben also alle deine Freunde keinen Rechner und spielen anstatt CS den ganzen Tag Mikado. Auch nicht schlecht, hätte nicht gedacht, dass es sowas noch gibt. :roll:

Es sei denn du bist schon über 20, dann könnte ich mir so was vorstellen.


ShadowCaster - Di 08.04.03 09:15

das Problem ist. Meine Freunde haben keinen Delphirechner mit einem Interbaseserver drauf... Ich fahr doch nicht extra 20 Kilometer zu nem Kumpel ohne Auto wenn der sowieso linux drauf hat.

Naja wenn du schon so große Töne spuckst, dann hast du sicher einen win2000 Rechner zum Testen... mit kompletter delphi entwicklungsumgebung drauf ... hehe. Um die Worte eines Daus zu zitieren: Mach ma! LOL :lol:

Ne, kleiner Scherz. so war das net gemeint. Wenns auf win2000 aber nicht klappt, find ichs *mist*e. Es ist halt blöd von microsoft win98 und 2000 so unterschiedlich aufzubauen dass keine für win98 kompilierten Anwendungen auf 2000 laufen und umgekehrt. Und ich als Delphientwickler soll mir aus den Fingern saugen wie ich die Fehler der Winapi ausbügel (oder des delphi-codes) ? Ich bin da leider sprachlos, weil mir einfach keine Lösung einfällt. Resignation... :cry:


Delete - Di 08.04.03 09:44

Wieso muß zum testen Delphi installiert sein? Im Gegenteil, es wäre sogar besser, wenn es nicht drauf wäre. Ein Problem ist allerdings der Interbase-Server, das stimmt.


ShadowCaster - Di 08.04.03 09:48

lol, hast recht.. bin noch nicht ganz wach... muss ja nur das prog testen ;) Naja interbase schon, weil das ne Datenbankapplikation ist. Aber ich könnte ja mal ne App ohne DB drauß machen. Nur andereseits, was bringt mir das zu wissen, dass es bei Win98 geht und bei 2000 nicht wenn das Ding auf nem recht großen Server laufen soll? Da wäre es ganz gut wenn nicht alle Traysymbole aktiviert werden, wenn ein User auf dem Server arbeitet. :wink:


Delete - Di 08.04.03 09:53

Du sollst es einfach auch mal unter anderen Windows2000 Rechnern testen, ob es da auch passiert. Einfach mal wild auf allen möglichen Rechnern testen: 2000, XP, NT, 98, ME...

Ich will nur, dass du mir sagst, dass es bei den anderen rechnern geht nur bei deinem nicht. Denn dann lioegt es eindeutig an deinem Rechner.


ShadowCaster - Di 08.04.03 10:40

schöne Hilfe hier wirklich.... Da hat einer einen Fehler der eindeutig nicht an einem selbst liegt und da kommen gleich ein paar Leute und reden so lange auf einen ein bis man glaubt man hat selbst mist gebaut und ja nicht das Betriebssystem schuld sei oder irgend was anderes, damit bloß keiner helfen muss ... Echt klasse... :?

Ich hab den Code von swissdelphicenter 1:1 übernommen und lediglich eine Variable noch verändert... sztip hab ich auf meinen Anwendungsnamen geändert, damit es funzt. Aber es öffnet immer alle anderen Trayicons auch...


Tino - Di 08.04.03 11:00

Hallo,

naja... was verlangst Du denn? Schließlich klappt das bei allen nur bei Dir nicht. Wo liegt dann wohl der Fehler? Bei Dir! Entweder hast Du den Code falsch implementiert oder Dein Betriebssystem ist kaputt.

Versuch doch mal das Tray-Icon-FAQ hier im Forum. Das habe ich geschrieben und es hat auf meinem Win2000 Rechner funktioniert! Wenn es nicht funktioniert dann versuch die gleiche Anwendung auf einer anderen Win2000-Installation zu testen. Klappt es dort dann installier Win2000 neu!

Gruß
Tino


Delete - Di 08.04.03 11:04

ShadowCaster hat folgendes geschrieben:
schöne Hilfe hier wirklich.... Da hat einer einen Fehler der eindeutig nicht an einem selbst liegt

Was noch zu beweisen wäre.
Zitat:

und da kommen gleich ein paar Leute und reden so lange auf einen ein bis man glaubt man hat selbst mist gebaut und ja nicht das Betriebssystem schuld sei oder irgend was anderes, damit bloß keiner helfen muss ... Echt klasse... :?

Ich hab den Code von swissdelphicenter 1:1 übernommen und lediglich eine Variable noch verändert... sztip hab ich auf meinen Anwendungsnamen geändert, damit es funzt. Aber es öffnet immer alle anderen Trayicons auch...

Das problem wird seinn, dass der Code bei allenanderen funktioniert, nur bei dir nicht. Und da du behauptest, du hättest ihn eins zu eins übernommen, muß es wohl an etwas anderes liegen. Logisch oder?

Was passiert denn wenn du den Code in einer neuen Anwendung einfügst und wirklich nicht und damit meine ich nichts daran änderst?


ShadowCaster - Di 08.04.03 11:06

lol win2000 neu installieren. An der Installation ist nix gemacht worden und die läuft mittlerweile schon ein halbes Jahr und das einwandfrei. Wie kommst ihr eigentlich auf die Idee das Betriebssystem neuinstallieren zu müssen, nur weil das mit dem Trayicon nicht klappt? Wenn ihr mit der Methode an eure Programmieraufgaben rangeht, dann dürft ihr windows sicher 2 mal pro Tag neu installieren. Das ist für mich keine Lösung. Vielleicht ist was am Code falsch (nicht mein Fehler, der Fehler vom swissdelphicenter ). Also ich schau nochmal und ich hoffe echt, dass ich das Ding zum Laufen krieg...

ich hab am Code nur eine Änderung vorgenommen, damit er in meine Anwendung passt und der Traybefehl beim Click wieder in meine Anwendung zurückgeht und nicht an eine andere.


Delete - Di 08.04.03 11:16

Überlegen wir mal:
100 Leute benutzen den Code. Bei 99 funktioniert er tadellos. Bei einem nicht. Ergo ist es bei den 99 Leuten purer Zufall, das der offensichtlich fehlerhafte Code funktioniert. :wink:

Noch was: Da der Code ja vom SDC ist, warum fragst du nicht dort nach Hilfe? BTW schreibst eien E-Mail an den Autor?

Hiermit wird der Support seitens der Luckie GmbH und CoKG eingestellt. Schönen Tag noch.


ShadowCaster - Di 08.04.03 15:59

hab jetzt einen anderen Code verwendet und es funzt. Naja... egal, hauptsache es funzt. :P


Delete - Di 08.04.03 21:28

Luckie hat folgendes geschrieben:
Überlegen wir mal:
100 Leute benutzen den Code. Bei 99 funktioniert er tadellos. Bei einem nicht. Ergo ist es bei den 99 Leuten purer Zufall, das der offensichtlich fehlerhafte Code funktioniert. :wink:

Ich glaube, mit diesem Satz hast du das Geheimnis von Windows gelüftet. :mrgreen:


rmasterb - So 13.04.03 11:11

als ich mal eine anfrage tum Tray hatte hat mir einer das gepostet aber ich hab es nie so richtig verstanden:

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:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
unit Unit1; 

interface 

uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ShellAPI, Menus; 

const 
  WM_TASKABAREVENT = WM_USER + 1

type 
  TForm1 = class(TForm) 
    PopupMenu1: TPopupMenu;
    Close1: TMenuItem;
    procedure FormDestroy(Sender: TObject); 
    procedure FormShow(Sender: TObject); 
    procedure FormCreate(Sender: TObject);
  private 
    NotifyIconData: TNotifyIconData; 
    { Private-Deklarationen } 
    procedure TaskbarEvent(var Msg: TMessage); Message WM_TASKABAREVENT; 
  public 
    { Public-Deklarationen } 
  end;

var 
  Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.TaskbarEvent(var Msg: TMessage); 
begin 
  case Msg.LParam of 
    WM_LBUTTONDBLCLK:
      begin
        // doppelclick
      end;
    WM_LBUTTONUP: 
      begin
        //Mach etwas nach einem Linksklick... 
      end
    WM_RBUTTONUP: 
      begin 
        // Rechtsklick
        SetForegroundWindow(Handle);
     end
  end
end

procedure TForm1.FormDestroy(Sender: TObject);
begin 
  with NotifyIconData do begin 
    Wnd   := Self.Handle; 
    szTip := 'Punkt'
  end
  Shell_NotifyIcon(NIM_DELETE, @NotifyIconData); 
end

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

procedure TForm1.FormCreate(Sender: TObject); 
begin
  Application.ShowMainForm:= False; 
  Fillchar(NotifyIconData,Sizeof(NotifyIconData),0); 
  with NotifyIconData do begin 
    cbSize           := Sizeof(NotifyIconData); 
    Wnd              := Handle; 
    uFlags           := NIF_MESSAGE or NIF_ICON or NIF_TIP; 
    uCallbackMessage := WM_TASKABAREVENT; 
    hIcon            := Application.Icon.Handle; 
    szTip            := 'Meine Anwendung'
  end
  Shell_NotifyIcon(NIM_ADD, @NotifyIconData); 
end

end.

ich währe übrigens auch froh wenn mir das einer kommentieren könnte


ShadowCaster - Mo 14.04.03 09:40

jetzt weiß ich warum es bei mir vielleicht nicht funktionieren konnte. Ich hab win2000 Server SP1 aufm Rechner. Es ging nämlich plötzlich wieder nicht. Auf meinem XP-Rechner hat der Code einwandfrei gefunzt. Naja, dennoch vielen Dank :) Vielleicht liegt das an der Serverversion von Windows. :wink:


Tino - Mo 14.04.03 15:59

rmasterb hat folgendes geschrieben:
ich währe übrigens auch froh wenn mir das einer kommentieren könnte

Schau Dir doch mal diesen Tipp [http://www.delphi-forum.de/viewtopic.php?t=8294] in unserer FAQ an. Dort wird alles erklärt.

Gruß
Tino


ShadowCaster - Mo 14.04.03 16:00

lol, warum hab ich den Beitrag nach stundenlangem Suchen nicht gefunden? :?


del1312 - Mo 02.06.03 19:27

Hab den Code von : http://www.tipps.delphi-source.de/desktop/tut20020915-4.shtml eingebaut. Klappt auch supi, bis auf: Wenn ich aufs Icon im Tray klick dann kommt immer das Programm daneben auch mit hoch. Woran kann das liegen? Hab ganz normal W2K.

Ach und noch ne Frage, wie kann ich das Prog so schreiben, das ich wenn auf die rechte Maustaste aufs Icon geklickt wird ein kleines Menü erscheint mit z.B Beenden?

Danke schonmal für die Hilfe!
mfg
ecspooky


Delete - Mo 02.06.03 21:32

Boah, wieder einer, der nicht lesen kann. :)
ecspooky hat folgendes geschrieben:
Wenn ich aufs Icon im Tray klick dann kommt immer das Programm daneben auch mit hoch. Woran kann das liegen? Hab ganz normal W2K.

Schauen wir doch mal auf Seite #1 dieses Threads und schauen, was ShadowCaster am 7. April diesen Jahres geschrieben hat:
ShadowCaster hat folgendes geschrieben:
hi Leute,

ich hab den Code von http://www.tipps.delphi-source.de/desktop/tut20020915-4.shtml mal ausprobiert.

Allerdings ist es so, dass wenn die Anwendung als Trayicon angezeigt wird und ich genau auf das eine Symbol meiner Anwendung klicke, ein Klick an alle Trayiconsymbole gesendet wird. Es gehen sämtliche Programme auf deren Symbole in der SysTray sind. :?:

Wo liegt da der Fehler im Quellcode oder ist da nur was vergessen worden? Ich nutze übrigens Win2000.



ecspooky hat folgendes geschrieben:
Ach und noch ne Frage, wie kann ich das Prog so schreiben, das ich wenn auf die rechte Maustaste aufs Icon geklickt wird ein kleines Menü erscheint mit z.B Beenden?

Dazu schrieb Tino am 14. April schon was. Im FAQ-Beitrag wird mit Hilfe von zwei MessageBoxen demonstriert, wie man auf den Klick der linken und rechten Maustaste reagieren kann. Ich bin der Meinung, so eine MessageBox lässt sich recht einfach durch ein Popup-Menü ersetzen.

Tja, es ist eben doch von Vorteil, wenn man lesen kann. Hm, (nach)denken ist natürlich auch wichtig, sonst versteht man das Gelesene nicht. :roll:


del1312 - Di 03.06.03 07:13

Trotzdem vielen Dank :D