Autor Beitrag
Kay E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Sa 26.11.11 23:20 
Hallo!

Hab ein kleines Programm geschrieben, dass beim Systemstart gestartet wird und ein paar Daten sichert. Das Programm nistet sich in der TNA ein und sichert nochmal, wenn Windows runtergefahren wird. Das Ding hat auch ne kleine GUI, die über ein Klick auf das Tray-Icon geöffnet wird. Hab sie so positioniert, dass sie direkt über der TNA angezeigt wird.
Und da ist jetzt das Schönheitsproblem: Wenn die GUI angezeigt wird, wird sie zum größten Teil von dem Fenster überdeckt, dass die ausgeblendeten TNA-Icons enthält und ich muss erstmal ne Weile warten, bis sich das Fenster von alleine wieder ausblendet.
Wie kann ich WIndows sagen, das es dieses Auswahlfenster direkt wieder ausblenden soll?

Danke für jeden Tipp :)
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 27.11.11 00:15 
Vielleicht den Stil des Formulares (Formstyle) auf fStayOnTop setzen?

Warum Daten nach dem Windows-Start gesichert werden, wenn doch vor dem zuvorigen Herunterfahren schon gesichert wurde, erschließt sich nicht. Nunja, vielleicht sind es nicht dieselben (die gleichen) Daten, doch wie werden Daten im ausgeschalteten Zustande verändert?
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: So 27.11.11 00:46 
Hmm... Dadurch kommt die GUI vor das Auswahlfenster, das ist schon gut. Aber es bleibt halt leider auch vorne. Das ist auch nciht wirklich optimal. Ein BringToFront hilft übrigens nicht.

Und es handelt sich dabei um Daten auf einem USB-Stick, der an verschiedenen Rechnern eingesetzt wird. Dadurch können sich die Daten durchaus ändern, wenn der eigentliche Rechner aus ist ;)
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 27.11.11 00:56 
Der Formularstil kann auch zur Laufzeit verändert werden, abhängig von einem Ereignis (z.B. Klick auf einen zusätzlichen Knopf) läßt er sich auch normalisieren. Müßte dann, wenn die Ikone angeklickt wird, um an das Formular zu gelangen, wieder auf fsStayOnTop gesetzt werden. Oder einfach das Formular, wenn es wieder verschwinden soll, mit Klick auf die Schließen-Schaltfläche nicht beenden, sondern wieder ins TNA verschwinden lassen (dazu OnClose oder OnCloseQuery abfangen). Das ist bei TNA-Programmen ohnehin üblich.
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: So 27.11.11 13:16 
Das ist mir schon alles klar (das mit StayOnTop umstellen etc). Das Problem ist doch aber an der Stelle, dass der Benutzer dann, nachdem er die GUI aufgerufen hat, nochmal auf einen Knopf drücken muss, der von fsStayOnTop auf fsNormal umstellt, damiti sich die GUI danach wie ein normales Anwendungsfenster verhält und nicht permanent OnTop ist. Oder ich verbinde die Eigenschaft über nen Timer und schätz grob ab, ab wann das TNA-Fenster wieder ausgeblendet wird - wobei das beides pfusch am Bau ist.
So wie ich das seh, ist das Auswahlfenster doch nichts anderes als eine eigenständige Anwendung, oder? Es müsste doch möglich sein, das Handle von dem Fenster zu bekommen und das dann zu hiden oder zu minimieren?
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 27.11.11 13:35 
Mit "Anwendung" ist wahrscheinlich das Programm gemeint. Wie diese hirnrissige Übersetzung den Weg in die deutsche Sprache gefunden hat, ist mir nach wie vor schleierhaft (keine Kritik an Dir).

Das Auswahlfenster ist keine eigenständige "Anwendung" (also Programm), sondern nur ein Formular (D)eines Programmes, das sowohl dieses Formular als auch die TNA-Ikone (und sicher noch viel mehr) bereitstellt.

Ein sog. "Timer" ist wahrlich noch schlimmer als eine Interaktion, die vom Benutzer ausgeht, da stimme ich Dir zu.

Das sog. "Handle" des Formulares ist über die Eigenschaft "Handle" ermittelbar. Zum Verstecken oder minimieren ist das doch aber gar nicht nötig, weil beides bereits in der Formularklasse bereitgestellte, aber erst in den Instanzen (also den konkreten Formularen) abrufbare Prozeduren sind.
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: So 27.11.11 14:28 
Ich befürchte, wir reden hier ein wenig aneinander vorbei. Ich hab da mal ein Bild gemacht, damit wir uns besser verstehen:

user defined image

Ursprüngliches Problem: Nach Klick auf die Ikone (wie du sie nennst) im Auswahlfenster erscheint die GUI meiner Anwendung hinter dem Auswahlfenster und ich muss warten, bis das Auswahlfenster sich schließt. Programmtechnisch soll bei Klick auf die Ikone aus dem TNA-Programm ein eigenständiges "normales" Programm werden, d.h. kein TNA-Eintrag mehr, dafür Eintrag in der Taskbar und Verhalten einer normalen Windows-Anwendung (also nicht permanentes StayOnTop).
Mein Gedanke von vorhin war, dass ich mir den Handle des Auswahlfensters besorg und es darüber minimiere - nicht das Handle meines GUI-Forms.

Ich hoffe, mein Problem ist jetzt ein wenig klarer geworden.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 27.11.11 14:42 
Ja, jetzt ist es klar. Du willst über einen Klick auf die TNA-Ikone (übrigens nur Deutsch für "Icon") Dein Programm mit dem versteckten Formular starten.

Hat es einen Grund, warum Du das Formular nicht einfach bildschirm- bzw. desktopzentrierst? Denn das würde dieses komplizierte Problem auf natürliche weise lösen.

Das "Handle" des Auswahlfensters ist natürlich ermittlebar, aber ob sich dieses Fenster einfach minimieren oder verstecken läßt (oder gegen eine mutwillige Veränderung von außen geschützt ist), müßte ausprobiert werden. Fenster lassen sich mit Enumwindows enumerieren (wer hätte das gedacht). Wäre der Name und/oder der Klassenname des Fensters das entscheidende Merkmal, vermute ich. Dazu kannst Du mein Programm "Prozesse" benutzen. Ich vermute, daß es ein Fenster/Formular des Windows-Explorers ist. Ich werde das gleich einmal ausprobieren.

Edit: Also, wenn ich die Fenster mir auflisten lassen möchte, verschwindet vorher das TNA-Auswahlfenster. Ob es nur versteckt ist oder tatsächlich geschlossen ist, vermag ich nicht zu sagen, weil ich in der Fensterauflistung keinen sicheren Hinweis auf dieses Fenster finde.
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Di 29.11.11 21:10 
Hmm... Kann ja eigentlich nicht Sinn der Sache sein, dass ich die GUI an die Eigenheiten des BS anpassen muss. Frei nach dem Motto "Und bist du nicht willig, so brauch ich Gewalt!" ;)

Wenn du sagst, dass durch die Enumeration das Fenster geschlossen wird, wäre das doch eigentlich ein möglicher Workaround. Muss ich nachher gleich mal probieren!
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 29.11.11 23:29 
user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
Hmm... Kann ja eigentlich nicht Sinn der Sache sein, dass ich die GUI an die Eigenheiten des BS anpassen muss. Frei nach dem Motto "Und bist du nicht willig, so brauch ich Gewalt!" ;)


Verstehe ich nicht.

user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du sagst, dass durch die Enumeration das Fenster geschlossen wird, wäre das doch eigentlich ein möglicher Workaround. Muss ich nachher gleich mal probieren!


Nein, das schreib ich nirgendwo. Ich schrieb, daß dieses TNA-Fenster wieder verschwindet, bevor ich die Fensterenumeration starten kann. Da ich in der Liste der daraufhin enumerierten (Explorer-)Fenster keinen Hinweis auf dieses ominnöse Fenster finde, nehme ich an, daß es nicht nur unsichtbar gemacht, sondern geschlossen wird.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Fr 17.02.12 13:43 
Ich wünsche einen guten Tag!

Die Diskussion ist zwar schon ein wenig angestaubt, doch wärme ich sie mit Grund wieder auf.

Heute hatte ich plötzlich die Erleuchtung, mit dem Programm "Winlister" von nirsoft.net der Sache noch einmal auf den Grund zu gehen. Und tatsächlich, dieses überwacht alle Fenster (nahezu) in Echtzeit. Damit kam ich auf den Klassennamen des "aufpoppenden" TNA-Fensters: NotifyIconOverflowWindow. Damit müßte es möglich sein, dieses Fenster über eine Enumeration ("EnumWindows") herauszufinden und - nach seiner Identifikation - über sein Handle zum Verschwinden zu bringen (entweder visible auf false oder disable oder einfach minimieren). Wenn Du noch interessiert bist und nicht weiterkommst, so hülfe ich Dir weiter.
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Di 21.02.12 21:10 
Hey, das ist ja toll, dass du an mich gedacht hast! Ich werd das sofort ausprobieren, sobald ich wieder ein paar Minuten Zeit zum Programmieren hab! Ich danke dir vielmals :)

Viele Grüße
Kay
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 22.02.12 12:52 
Also, beim Programmstart enumierierst Du die Fenster, bis eines mit der o.g. Klasse auftaucht. Dann hast Du wahrscheinlich das richte, kannst es entsprechend "bearbeiten" und die Enumeration abbrechen.

Unter Windows 2000 & XP scheint der Klassenname noch nicht vergeben (worden) zu sein, dort finde ich nach dem Aufpoppen "#32768". Also am besten ausprobieren und ggf. sogar zwei Klassennamen zulassen.

Edit: "#32768" ist Unfug; das betrifft nur das kleine Fenster, das die entfernbaren ("removable") Dinge wie z.B. USB-Geräte auflistet: "Hardware entfernen oder auswerfen".


Zuletzt bearbeitet von Delphi-Laie am Fr 20.04.12 17:39, insgesamt 2-mal bearbeitet
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Do 05.04.12 20:28 
So, jetzt bin ich auch endilch dazu gekommen, diesen kleinen Code-Schnippsel zusammen zu schreiben. So schaut der Code aus:

ausblenden 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:
procedure TMainForm.CloseTray;
  function EnumFunction(hwnd: HWND; lparam: Integer): Boolean; stdcall;
  var
    ClassName: string;
  begin
    result := true;
    if hwnd = NULL then
    begin
      result := false;
    end
    else
    begin
      SetLength(ClassName, 255);
      SetLength(ClassName, GetClassName(hwnd, PChar(ClassName), Length(ClassName)));
      if ClassName = cTNAClassName then  //const cTNAClassName = 'NotifyIconOverflowWindow';
      begin
        PostMessage(hwnd, WM_CLOSE, 00);
        result := false;
        exit;
      end;
    end;
  end;

begin
  EnumWindows(@EnumFunction, 0);
end;


Der Code wird jedesmal aufgerufen, wenn ich auf das Tray-Symbol klicke. Funktioniert auch einwandfrei, das TNA-Fenster verschwindet.

Vielen Dank Delphi-Laie für den Klassennamen! Damit hat alles toll funktioniert!

Liebe Grüße Kay
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 05.04.12 21:36 
Und wieder einmal wurden Winzigweich bzw. Windows mit ihren eigenen Waffen geschlagen....
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Fr 18.05.12 22:33 
Hallo Kay!

Viel einfacher kann man an das Handle des gesuchten Fensters mit FindWindow('NotifyIconOverflowWindow',nil) gelangen. Der Rückgabewert dieser Funktion ist das Handle auf dieses Fenster, wobei bei mehreren nur eines gefunden wird (das erste in Richtung aufsteigender Handlewerte?). Es dürfte aber nur ein Fenster mit diesem Klassennamen geben, instofern ist das unproblematisch. Fand ich soeben heraus. Also vollständiger:

ausblenden Delphi-Quelltext
1:
PostMessage(FindWindow('NotifyIconOverflowWindow',nil), WM_CLOSE, 00)