| Autor |
Beitrag |
Dietmar1961
      
Beiträge: 18
|
Verfasst: Fr 14.04.06 16:30
Hallo mal eine Frage
ich starte mit in meiner Applikation ein Programm automatisch und beende es nach einiger Zeit wieder und das in festen Zeitabständen immer wieder (FTP-Watchdog.exe).
Funktioniert wunderbar nur ist mir aufgefallen, dass rechts im Tray, wo aktive Programme angezeigt werden eine Aktualisierung nur stattfindet, wenn ich mit dem Mauszeiger drüberfahre und so tummeln sich bei jedem Programmaufruf mehr Icons. Kann man die irgendwie aktualisieren?
Danke schon mal für die Antwort

|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 14.04.06 16:33
Dietmar1961 hat folgendes geschrieben: | | und so tummeln sich bei jedem Programmaufruf mehr Icons. Kann man die irgendwie aktualisieren? |
Klingt eher so, als wenn du es nicht entfernst, wenn du dein Programm beendest.
|
|
Dietmar1961 
      
Beiträge: 18
|
Verfasst: Fr 14.04.06 21:11
Da könntest du recht haben. Ruf ne Funktion auf, die nicht von mir stammt. Muss ich mal untersuchen aber vielen Dank für den Tipp.
Bin noch Neu hier und oft sieht man die naheliegendsten Dinge nicht 
|
|
kandesbunzler
      
Beiträge: 116
Erhaltene Danke: 1
Delphi 7, XE2
|
Verfasst: Di 21.11.06 23:57
Hallo allerseits,
ich bin aus der Antwort leider nicht ganz schlau geworden. Wenn bspw. die Icons von einem Programm generiert werden, welches aus meiner Applikation gestartet wird, wie kann ich diese 'eliminieren'?
Kann es auch sein, daß ein 'Refresh' der Tray- bzw. Taskbar erzwungen werden muß? Und wenn ja, wie?
Auf bald ...
kandesbunzler.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.11.06 10:36
So muss es aussehen:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.FormDestroy(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @IconData); end; |
Und das ganzer Beispiel hier: www.michael-puff.de/...i/Sonstiges/TNA.html
|
|
kandesbunzler
      
Beiträge: 116
Erhaltene Danke: 1
Delphi 7, XE2
|
Verfasst: Fr 01.12.06 15:08
Hallo allerseits,
die Prozedur funktioniert ja dann aber nur, wenn die eigene Applikation beendet wird.
Problem: Meine Applikation (Prog_A.exe) ruft eine unabhängige Applikation (Prog_B.exe) auf. Prog_B.exe wird durch das (weiterlaufende) Prog_A.exe geschlossen. Ergo: Prog_B.exe 'hinterläßt' die Icons - nicht mein Prog_A.exe.
Auf bald ...
kandesbunzler.
|
|
kandesbunzler
      
Beiträge: 116
Erhaltene Danke: 1
Delphi 7, XE2
|
Verfasst: Sa 02.12.06 01:04
Nachtragsfrage: Welche generelle Möglichkeit gibt es, den Tray- resp.- Taskbarrefresh zu erzwingen?
Auf bald ...
kandesbunzler.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 02.12.06 15:42
Wie beendest du denn die andere Anwendung? Ist diese andere Anwendung auch von dir?
|
|
kandesbunzler
      
Beiträge: 116
Erhaltene Danke: 1
Delphi 7, XE2
|
Verfasst: So 03.12.06 20:25
Leider nein, es handelt sich um ein ein Steuerprogramm für USB-Device-Servers und wird mit 'Prog_B.exe' aus meiner Applikation aufgerufen. Aufruf und Schließen per 'KillTask' Funktion funktioniert auch, nur, wie schon gesagt, tummeln sich die 'Icon-Leichen' in der Traybar, welche erst beim 'Überfahren' mit der Maus OHNE jegliche Aktion (ohne Klick etc.) verschwinden. Es handelt sich hier um einen optischen Schönheitsfehler.
Deshalb die Anfrage nach Refreshoption der Traybar per Befehl.
Auf bald ...
kandesbunzler.
PS: Nach mehrfachem Starten und Schließen des 'Prog_B.exe' erhöht sich die Anzahl der 'Iconleichen' jeweils um eins.
|
|
Stefan.Buchholtz
      
Beiträge: 612
WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
|
Verfasst: Mo 04.12.06 14:09
kandesbunzler hat folgendes geschrieben: | Leider nein, es handelt sich um ein ein Steuerprogramm für USB-Device-Servers und wird mit 'Prog_B.exe' aus meiner Applikation aufgerufen. Aufruf und Schließen per 'KillTask' Funktion funktioniert auch, nur, wie schon gesagt, tummeln sich die 'Icon-Leichen' in der Traybar, welche erst beim 'Überfahren' mit der Maus OHNE jegliche Aktion (ohne Klick etc.) verschwinden. Es handelt sich hier um einen optischen Schönheitsfehler.
Deshalb die Anfrage nach Refreshoption der Traybar per Befehl.
Auf bald ...
kandesbunzler.
PS: Nach mehrfachem Starten und Schließen des 'Prog_B.exe' erhöht sich die Anzahl der 'Iconleichen' jeweils um eins. |
Gibt es denn keine Möglichkeit, Prog_B.exe sauber zu beenden anstatt es mit KillTask abzuschiessen? Dann hat das Programm natürlich auch keine Möglichkeit, ordentlich aufzuräumen und das Trayicon wieder zu entfernen. Das kann auch andere unerwünschte Effekte haben, wie z.B. dass DLLs nicht entladen werden und als Speicherleichen zurückbleiben.
Stefan
_________________ Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.
|
|
kandesbunzler
      
Beiträge: 116
Erhaltene Danke: 1
Delphi 7, XE2
|
Verfasst: So 10.12.06 18:23
Hallo Stefan und allerseits,
sowie Danke für die Antwort. Dies wäre tatsächlich die sauberere Variante. Wenn ich das Prog_B.exe beende, werde ich aber mit der Sicherheitsabfrage 'belästigt', ob das Programm wirklich beenden will.
Frage: Läßt sich diese Abfrage unterdrücken bzw. 'automatisch' durch einen 'ghost'-Mausklick bejahen?
Auf bald ...
kandesbunzler.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Di 12.12.06 08:58
kandesbunzler hat folgendes geschrieben: | Hallo Stefan und allerseits,
sowie Danke für die Antwort. Dies wäre tatsächlich die sauberere Variante. Wenn ich das Prog_B.exe beende, werde ich aber mit der Sicherheitsabfrage 'belästigt', ob das Programm wirklich beenden will.
Frage: Läßt sich diese Abfrage unterdrücken bzw. 'automatisch' durch einen 'ghost'-Mausklick bejahen?
Auf bald ...
kandesbunzler. |
Hallo,
ganz anderer Ansatz: wenn du herauskriegen kannst, welche ID das Fremdprogramm für die Icons angibt, könntest du das Taskbar-Icon selbst mit Shell_NotifiyIcon entfernen. Genau das Herauskriegen wird das Problem sein.
Gruss Reinhard
|
|
kandesbunzler
      
Beiträge: 116
Erhaltene Danke: 1
Delphi 7, XE2
|
Verfasst: Do 14.12.06 00:04
Hallo Reinhard ...
... und alle anderen. -)
Mittlerweile habe ich über das XSpy - Tool (absolut genial!) sogar das Handle für die Abfragemeldung herausbekommen.
Nunmehr möchte ich den Button für 'Ja' virtuell drücken, bspw. mit:
'SendMessage(wnd, WM_CLOSE, 0, 0);'
Ergebnis: Der 'Ja' - Button wird eliminiert. Das schaut recht lustig aus. Nachdem ich die Prozedur auch auf 'Nein' ausgedehnt hatte, ... .
Frage: Wie heißt der 'Button-Down' - Befehl, ohne den Fensteinhalt zu leeren?
Danke und auf bald ...
kandesbunzler.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Do 14.12.06 03:10
kandesbunzler hat folgendes geschrieben: | Hallo Reinhard ...
... und alle anderen. -)
Mittlerweile habe ich über das XSpy - Tool (absolut genial!) sogar das Handle für die Abfragemeldung herausbekommen.
Nunmehr möchte ich den Button für 'Ja' virtuell drücken, bspw. mit:
'SendMessage(wnd, WM_CLOSE, 0, 0);'
Ergebnis: Der 'Ja' - Button wird eliminiert. Das schaut recht lustig aus. Nachdem ich die Prozedur auch auf 'Nein' ausgedehnt hatte, ... .
Frage: Wie heißt der 'Button-Down' - Befehl, ohne den Fensteinhalt zu leeren?
Danke und auf bald ...
kandesbunzler. |
Hallo,
ich weiss nicht genau, ob es das ist, was du meinst:
Ein Button weiss von nichts ausser das er einen Identifier hat (16bit-Zahl, ich glaube Delphi vergibt die automatisch). Wird der Button gedrückt, sendet er "WM_COMMAND" an sein übergeordnetes Fenster. i.a. den Dialog. In WM_COMMAND wird die ID des Buttons angegeben, Näheres in der SDK-Hilfe. Für die ID kannst du Spy nochmal anwerfen.
Es ist die Dialog-Message-Loop, die weiss, was auf den gedrückten Button geschehen soll. Um einen Button vollständig zu emulieren, sollte man also eine WM_COMMAND-Message mit dem richtigen Inhalt an das Dialog-Fenster schicken.
Gruss Reinhard
|
|