Autor Beitrag
Szorcc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29



BeitragVerfasst: Di 04.02.03 22:04 
Hi,

wie kann ich verhindern, dass bei "Desktop zeigen" mein Proggi minimiert wird?
SYSCOMMAND, SC_MINIMIZE usw. funzt nicht. :(
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: 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):
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: 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:
ausblenden Quelltext
1:
procedure WndProc(var nachricht: tMessage); override;					

und im Implementationsteil:
ausblenden 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