Entwickler-Ecke
Windows API - Desktop zeigen verhindern
Szorcc - Di 04.02.03 22:04
Titel: Desktop zeigen verhindern
Hi,
wie kann ich verhindern, dass bei "Desktop zeigen" mein Proggi minimiert wird?
SYSCOMMAND, SC_MINIMIZE usw. funzt nicht. :(
Brueggendiek - Mi 05.02.03 01:15
Hallo!
Ein ähnliches Problem hatte ich auch mal. Nur war es bei mir ein Programm, das sich dann in die TNA verziehen sollte und dabei den Taskbar-Eintrag löschen.
Leider habe ich auch keine wirkliche Lösung gefunden, aber man kann es so durchführen:
Du brauchst einen Timer auf dem Formular und bei Aktivierung (OnClick):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TimerClick(Sender: tObject); var eigner : tHandle;
begin eigner := GetWindow(Self.Handle, GW_OWNER); ShowWindow(eigner, SW_NORMAL); ShowWindowAsync(eigner, SW_NORMAL); { für Windows 2000 } ShowWindowAsync(Self.Handle, SW_NORMAL); { für Windows 2000 } end; |
Irgendwo habe ich mal gefunden, daß das mit ShowWindowAsync bei Win2000 nötig wäre und deshalb "auf Verdacht" reingesetzt.
Dann wird Dein Formular immer wieder angezeigt. Zusätzlich FormStyle = fsStayOnTop setzen, und es ist nicht wegzubekommen. Ohne habe ich in seltenen Fällen doch ein Minimieren bemerkt und das Formular kann verdeckt werden.
Der Timer kostet natürlich Rechenzeit. Allerdings vermute ich, daß es keine andere Möglichkeit gibt. Bei meiner DSL-Karte ist ein Programm, das nur über das Programm selbst minimiert werden kann. Auf "Win+D" flimmert da auch das Bild und wird neu aufgebaut.
Gruß
Dietmar Brüggendiek
Szorcc - Mi 05.02.03 11:16
Darüber habe ich auch schon nachgedacht. Und diese Lösung scheint mir auch im Moment die einzig Mögliche.
Aber der Taskmanager sendet doch mit Sicherheit irgendeine Message an alle Programme, sich zu minimieren. Diese Message muss sich doch abfangen lassen, oder?
Brueggendiek - Do 06.02.03 01:11
Hallo!
Zunächst einmal: Bei "Alles minimieren" wird
nicht minimiert! Es wird lediglich der Desktop (der ja auch nur ein Fenster ist) mit seinem Hintergrundbild und seinen Symbolen ganz nach vorne gebracht, alle anderen Fenster sind verdeckt.
Wie ich schon erwähnte, war mein Problem genau entgegengesetzt - bei Minimieren husch husch ins Körbchen (TNA).
Leider ergab sich bei meinen Versuchen ein Problem: Die Message "WM_SHOWWINDOW" auswerten brachte nichts, weil mein Programm zu schnell war. Daraufhin habe ich ein Flag gesetzt und meinen Standard-Timer (Anzeige von Datum und Uhrzeit auf dem Hauptformular, Intervall 100) dann einmal das Ganze bearbeiten lassen. Klappte auch nur selten.
Also habe ich noch einen Zähler eingebaut, der bei gesetztem Flag vom Timer hochgezählt wird und bei Erreichen eines bestimmten Wertes dann das Verstecken des Hauptformulars auslöst.
Das Ergebnis war enttäuschend: mal reichten 2 Klicks (200 ms), mal wurden 5 (500 ms) gebraucht, um sicher zu funtionieren. Und ich fand keine Möglichkeit, festzustellen, ob das Ergebnis da war.
Da mein Programm im Prinzip nur 2 zusätzliche Threads startet und selber nur (seltene) Benutzereingaben bearbeitet, war bei mir die Lösung: "wenn in TNA, dann verstecken, sonst zeigen" aus Performancegründen akzeptabel.
Alle Angaben für Win98 und Delphi 5
Falls Du selber experimenrtieren willst:
im Interface-Teil des Formulars:
Quelltext
1:
| procedure WndProc(var nachricht: tMessage); override; |
und im Implementationsteil:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure WndProc(var nachricht: tMessage); begin case nachricht.Msg of WM_SHOWWINDOW: begin if (nachricht.WParam = 0) and (nachricht.LParam = 1) then begin // hier den Code einfügen end; end; else inherited; end; end; |
Bei Minimieren wird die markierte Stelle aufgerufen (ggf. muß auch hier der Vorgänger mit "inherited" aufgerufen werden.
Bitte nicht über das hier etwas überzogene Case wundern - bei mir werden noch weitere Meldungen ausgewertet. Oben steht nur ein Ausschnitt aus meiner Prozedur.
Gruß
Dietmar Brüggendiek
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!