Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Das Minimieren des Fensters abfangen (https://www.delphipraxis.net/166451-das-minimieren-des-fensters-abfangen.html)

Popov 14. Feb 2012 10:53

Das Minimieren des Fensters abfangen
 
Und zwar geht es um den Dektop-Button in der Quick Launch. Diese Anweisung minimiert alle Fenster, auch eine zweite Taskbar von mir, die eigentlich immer sichtbar sein sollte. Weiß einer was da passiert? Wie gesagt, SC_MINIMIZE ist es in dem Fall nicht.

himitsu 14. Feb 2012 12:55

AW: Das Minimieren des Fensters abfangen
 
SC_...
Von Windows kommen WM_-Nachrichten.

Davon könntest du die Entsprechende abfangen/ignorieren.

Darlo 14. Feb 2012 13:21

AW: Das Minimieren des Fensters abfangen
 
Erst lesen dann antworten...
Die Antwort kannst Du ignorieren, sorry;


####################################
Vielleicht in etwa so:

Code:
procedure TForm.FormResize(Sender: TObject);
begin
if form.windowstate = wsminimized then
  SendMessage(Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
end;

procedure TForm.MyWM_SYSCOMMAND(var aMsg: TMessage);
begin
  if aMsg.WParam = SC_MINIMIZE then
    Application.Minimize
  else
    inherited;
end;
Gruß

Popov 14. Feb 2012 13:46

AW: Das Minimieren des Fensters abfangen
 
Zitat:

Zitat von himitsu (Beitrag 1151020)
SC_...
Von Windows kommen WM_-Nachrichten.

Da steht auch nirgendwo das Wort Message oder Nachricht. Ich meinte die SC_MINIMIZE Konstate der WM_SYSCOMMAND Message. Ich dachte das war ersichtlich.

Zitat:

Davon könntest du die Entsprechende abfangen/ignorieren.
Nun, das ist ja das Problem. Das scheint keine WM_SYSCOMMAND Message zu sein.

@Darlo

Das habe ich in etwa auch so versucht, ohne Erfolg.

DeddyH 14. Feb 2012 13:47

AW: Das Minimieren des Fensters abfangen
 
Das dürfte auch nicht ganz so trivial sein: http://www.mombu.com/microsoft/windo...on-567693.html

ConnorMcLeod 14. Feb 2012 15:48

AW: Das Minimieren des Fensters abfangen
 
Vllt reicht es so indem Du Deine Logik einsetzt:

Delphi-Quellcode:
    procedure WMSysCommand ( Var Message : TWMSysCommand ); message WM_SYSCOMMAND;
    procedure SizeMove (var msg: TWMSize); message WM_SIZE;

-----

procedure TForm1.WMSysCommand ( Var Message : TWMSysCommand );
begin
  inherited;
  case Message.CmdType of
    SC_RESTORE:
      begin
      end;
    SC_MAXIMIZE:
      begin
      end;
    SC_MINIMIZE:
      begin
      end;
  end;
end;

procedure TForm1.SizeMove(var msg: TWMSize);
begin
  inherited;
  case msg.SizeType of
    SIZE_RESTORED : ;
    SIZE_MINIMIZED: ;
    SIZE_MAXIMIZED: ;
    SIZE_MAXSHOW : ;
    SIZE_MAXHIDE : ;
  end;
end;

Popov 17. Feb 2012 01:13

AW: Das Minimieren des Fensters abfangen
 
@ConnorMcLeod

Klappt auch nicht. Ich hab in alles was mir einfiel ein Beep-Signal eingebaut, auch in Application.OnMinimize. Alles funktioniert wie es soll, nur nicht denn der Desktopbutton geklickt wird.

Ich gucke mir mal den Link von DeddyH genauer an, auch wenn mein Englisch beschissen ist

EWeiss 17. Feb 2012 06:02

AW: Das Minimieren des Fensters abfangen
 
Zitat:

Und zwar geht es um den Dektop-Button in der Quick Launch
Ich komme damit nicht klar.
Was verstehst du unter Quick Launch?

Meinst du den Button Desktop Anzeigen?
Wenn ja wer sagt dir das hier die Anwendungen Minimiert werden?
Ich möchte das bezweifeln.

Dieser Button schaltet die ZORDER des Desktop.

gruss

ConnorMcLeod 17. Feb 2012 06:42

AW: Das Minimieren des Fensters abfangen
 
Hilft das hier?
Oder das?

Popov 17. Feb 2012 07:53

AW: Das Minimieren des Fensters abfangen
 
Ok, danke Jungs, es hat geklappt.

Zitat:

Zitat von ConnorMcLeod (Beitrag 1151538)
Hilft das hier?
Oder das?

Bedingt, wobei ich mit OnDeActivate und OnMinimaze es auch schon versucht habe.

Zitat:

Zitat von EWeiss (Beitrag 1151536)
Was verstehst du unter Quick Launch?

Ich meine die Schnellstart-Leiste ;)

Ist zum Mäuse melken. Jahre lang schrieb ich immer "Schnellstart-Leiste". Als Antwort bekam ich: "Hä, was ist eine Schnellstartleiste? Meinst du die Quick Launch?". Schreibe ich Quick Launch... ach, ist egal.

Zitat:

Wenn ja wer sagt dir das hier die Anwendungen Minimiert werden?
Ich möchte das bezweifeln.
Ich eigentlich auch, wobei es optisch nach minimieren aussieht. Spätestes nachdem ich gemerkt habe, dass keine Message ankommt.

Zitat:

Dieser Button schaltet die ZORDER des Desktop.
Das war das Stichwort. Obwohl das Stichwort, der Versuch ConnorMcLeod's Tipp auszuführen und die Kleinigkeit, dass eines meine Programme die im Hintergrund laufen beim Versuch oben blieben, ergab, dass das die Lösung ist:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  SetWindowPos(Handle, HWND_TOPMOST, Left,Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  SetWindowLong(Handle, GWL_HWNDPARENT, 0);
end;

DeddyH 17. Feb 2012 07:59

AW: Das Minimieren des Fensters abfangen
 
Polling per Timer? Naja, wenn es funktioniert...

Popov 17. Feb 2012 08:11

AW: Das Minimieren des Fensters abfangen
 
Ok, wenn ich Zeit habe überlege ich mir etwas anderes, aber vorerst funktioniert es.

Aber letztendlich läuft es doch immer auf einen Timer aus, auch wenn ich nicht brutal das Fenster nach vorne stelle, sondern erst abfrage ob es nötig ist.

Denn das ist die Funktion:

Command=ToggleDesktop

Wie soll ich das abfangen?

ConnorMcLeod 17. Feb 2012 08:14

AW: Das Minimieren des Fensters abfangen
 
Fein, wenn's funkt, aber schöner fände ich, wenn man die Message ans Desktop-Fenster irgendwie mitschnüffeln könnte und darauf reagieren kann. Dadurch müßte der Timer nicht dauernd aktiv sein. Oder ganz entfallen.
So, wie z.B.:

Code:
wenn die Message daher kommt...
  warte, bis ich nicht mehr topmost bin, dann
  solange ich nicht topmost bin
    setz mich topmost
  gut ist

DeddyH 17. Feb 2012 08:17

AW: Das Minimieren des Fensters abfangen
 
Wie in dem von mir weiter oben verlinkten Thread steht:
Zitat:

"Show Desktop" sends the command "ToggleDesktop", which, among other things, posts a DTM_RAISE message (WM_USER + 83) to the Desktop (Progman) to set it on foreground.

This could be used to intercept the "Show Desktop" command by an application, but it would involve installing a global hook.
Wenn man bereit ist, den Aufwand zu treiben, hat man eine recht elegante Lösung.

ConnorMcLeod 17. Feb 2012 08:38

AW: Das Minimieren des Fensters abfangen
 
Yo, den global Hook habe ich überlesen, mir aber sowas gedacht. Vllt ist mir am WE langweilig, dann setz ich mich dran, weil ich das auch brauchen könnte.

Popov 17. Feb 2012 09:09

AW: Das Minimieren des Fensters abfangen
 
Zitat:

Zitat von DeddyH (Beitrag 1151554)
Wenn man bereit ist, den Aufwand zu treiben, hat man eine recht elegante Lösung.

Letztendlich hätte ich den Aufwand betrieben und werde es auch machen, wobei das Problem in erster Linie gelöst ist. Wir wissen nun was das Problem ist, was es ist und was es nicht ist und was die Lösung ist. Der Rest ist nur noch eine Fleißarbeit.

Sir Rufo 17. Feb 2012 11:01

AW: Das Minimieren des Fensters abfangen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Es gibt hierfür einen komplizierten Weg, so wie bislang hier beschrieben

oder eben einen einfaachen Weg (den ich immer bevorzuge)

Im Anhang die kompilierte Anwendung und der Source.

Und wie man sieht war der Ansatz schon richtig, aber die Stelle war falsch ;)

EWeiss 17. Feb 2012 13:26

AW: Das Minimieren des Fensters abfangen
 
Bei meiner anwendung kann das BS diese nicht in der ZORDER verändern.
Denke das liegt daran das sie kein Caption hat. (Skin Form)

Zitat:

Und wie man sieht war der Ansatz schon richtig, aber die Stelle war falsch
Korrekt ;)

gruss

AlexII 8. Mär 2012 18:34

AW: Das Minimieren des Fensters abfangen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1151597)
Im Anhang die kompilierte Anwendung und der Source.

Wow das ist das wonach ich schon lange suche, hab aber diese Fehlermeldung

Delphi-Quellcode:
NoMinimizeForm.dpr(6): Datei nicht gefunden: 'Vcl.Forms.dcu'


Wie erzeuge ich die dcu Datei?

Popov 8. Mär 2012 18:41

AW: Das Minimieren des Fensters abfangen
 
Entferne überall "Vlc.", dann klappt es.

AlexII 8. Mär 2012 18:45

AW: Das Minimieren des Fensters abfangen
 
Danke, aber so einfach ist es doch nicht. Hab jetzt das hier

Delphi-Quellcode:
[Fehler] NoMinimizeForm.dpr(13): Undefinierter Bezeichner: 'MainFormOnTaskbar'

himitsu 8. Mär 2012 18:57

AW: Das Minimieren des Fensters abfangen
 
Zitat:

Zitat von AlexII (Beitrag 1155462)
Wie erzeuge ich die dcu Datei?

Garnicht.

Es wäre ja zu praktisch, wenn du deine Delphi-Version angeben würdest. :roll:

In XE2 wurden die delphieigenen Units mit einem Namespace versehn. (früher hieß diese mal Forms)

Und Delphi-Referenz durchsuchenTApplication.MainFormOnTaskbar ... entweder dein Delphi kennt es schon oder nicht.

AlexII 8. Mär 2012 19:00

AW: Das Minimieren des Fensters abfangen
 
Hab Delphi 7 Personal :(

Was kann ich anstatt TApplication.MainFormOnTaskbar einsetzen?

Popov 8. Mär 2012 19:10

AW: Das Minimieren des Fensters abfangen
 
Zitat:

Zitat von AlexII (Beitrag 1155466)
Danke, aber so einfach ist es doch nicht. Hab jetzt das hier

Delphi-Quellcode:
[Fehler] NoMinimizeForm.dpr(13): Undefinierter Bezeichner: 'MainFormOnTaskbar'

Doch, so einfach ist es, ich hab es auch gemacht.

Edit:

Ok, und die Zeile raus. Stimmt.

AlexII 8. Mär 2012 19:43

AW: Das Minimieren des Fensters abfangen
 
Hab es entfernt, aber ist es nicht wichtig für Windows 7, wird es auch da ohne Probleme funken?

Sir Rufo 8. Mär 2012 20:11

AW: Das Minimieren des Fensters abfangen
 
Zitat:

Zitat von AlexII (Beitrag 1155479)
Hab es entfernt, aber ist es nicht wichtig für Windows 7, wird es auch da ohne Probleme funken?

Eigentlich schon, aber Delphi 7 unterstützt das eben noch nicht ... also weg damit und fertig ;)

AlexII 8. Mär 2012 20:13

AW: Das Minimieren des Fensters abfangen
 
Also das ist der Hammer, jetzt kann ich Minianwendungen (wie man sie in Win 7 nennt) schreiben! :thumb:

Danke euch, vor allem "Sir Rufo"

himitsu 8. Mär 2012 20:15

AW: Das Minimieren des Fensters abfangen
 
"Alte" Delphi-Versionen zeigen das das versteckte Application-Fenster in der Taskleiste an.
TApplication ist quasi ein MessageOnlyWindow, worüber wichtige SystemMessages behandelt werden.

"Neuere" Delphi-Versionen zeigen dort das Hauptfenster (MainForm) an, denn seit Vista gibt es ja das Aero.
So wird z.B. in der Taskleiste eine Vorschau des zugehörigen Fensters angezeigt. (halte mal die Maus über einen Taskbareintrag)
Bei deinem Delphi-Programm wirst du nichts sehn, da natürlich nichts auf diesem Fenster drauf ist.
Zu Abwärtskompatibilität könnte nan nun neuere Delphi-Programma aber wieder in den alten Modus umschalten.


Tipp: Im DP-Profil kann man sein Delphi angeben.

AlexII 8. Mär 2012 20:21

AW: Das Minimieren des Fensters abfangen
 
Danke für die Info!

...

Jah... zu früh gefreut, das Fenster bleibt immer im Vordergrund. Wie kann ich das wohl "abstellen"? :gruebel:

Popov 8. Mär 2012 20:57

AW: Das Minimieren des Fensters abfangen
 
Delphi-Quellcode:
Hide
oder wenn es ohne Mainform starten soll:

Delphi-Quellcode:
begin
  Application.Initialize;
  Application.CreateForm(TfrmMain, frmMain);
  Application.ShowMainForm := False; //<<<<
  Application.Run;
end.
Edit:

Upps, wohl falsch verstanden. Meinst du es ist Top und du willst es nicht Top haben?

AlexII 8. Mär 2012 21:02

AW: Das Minimieren des Fensters abfangen
 
Was meinst du mit Hide?

Popov 8. Mär 2012 21:19

AW: Das Minimieren des Fensters abfangen
 
Zitat:

Zitat von Popov (Beitrag 1155493)
Upps, wohl falsch verstanden. Meinst du es ist Top und du willst es nicht Top haben?

Wie gesagt, Upps.

Was stört dich genau? Das habe ich nicht richtig verstanden. Die soll nur nicht minimiert werden oder nicht auf Win+D reagieren oder nie verschwinden aber auch nicht Top sein?

AlexII 8. Mär 2012 21:45

AW: Das Minimieren des Fensters abfangen
 
Das Fenster bzw. Formular ist immer im Vordergrund, das will ich aber nicht haben.

Popov 8. Mär 2012 22:07

AW: Das Minimieren des Fensters abfangen
 
Du guckst dir aber auch nicht den Code an, oder ;)

Schmeiß
Delphi-Quellcode:
SetWindowPos( Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE )
raus. Da steht dick HWND_TOPMOST


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz