![]() |
Minimieren geht nicht mehr
Salü zusammen. :)
Hab nur ich ein Problem mit fogendem Programm, oder gibt es da ein prinzipielles Problem? 1. Programm starten und minimieren. 2. Programm nochmals starten. Wie erwartet wird die erste Instanz aktiviert. Nur, jetzt läßt sich das Ding nicht mehr minimieren.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private public end; var Form1: TForm1; Handle: THandle; implementation {$R *.DFM} initialization begin Handle:= CreateMutex(nil, true, 'Form1'); if GetLastError=ERROR_ALREADY_EXISTS then Halt; end; finalization begin if Handle<>0 then CloseHandle(Handle); Handle:= FindWindowEx(0, 0, 'TForm1', nil); If Handle<>0 then begin if IsIconic(Handle)=true then showmessage('IsIconic'); // funktioniert NICHT if IsZoomed(Handle)=true then showmessage('IsZoomed'); // funktioniert, wird allerdings auch bei minimiertem Fenster angezeigt if IsWindowVisible(Handle)=false then SendMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, Handle) else SendMessage(Handle, WM_SYSCOMMAND, SC_DEFAULT, Handle); // ShowWindow(Handle, SW_SHOWMAXIMIZED); // gleiches Ergebnis minimieren nicht mehr möglich, wenns minimiert war. SetForegroundWindow(Handle); end; end; end. |
Re: Minimieren geht nicht mehr
also ich hab bemerkt (korigier mich wen ich falsch liegen sollte)
das man fenster nicht minimieren kann bevor sie komplett geladen worden sind... Ich löse das problem immer etwas unschön mit einem timer: setze den timer auf 1MS und gib ihm den befehl die Form zu minimieren und sich selbst danach zu disabeln das klappt bei mir zu 100% grüsschen |
Re: Minimieren geht nicht mehr
Das sollte nicht das Problem sein. Das Fenster des ersten Aufrufes ist ja komplett da, und das Fenster des zweiten Aufrufes ist zu diesem Zeitpunkt schon 'abgewürgt'.
|
Re: Minimieren geht nicht mehr
Das Problem ist das du sicher nicht das Form minimieren willst sondern die ganze Application. Oder willst du nur ein Fenster minimieren so das es über der Taskleiste hängt?
|
Re: Minimieren geht nicht mehr
:?: Also, jetzt muss ich vorsichtig werden. Könnte sein, daß das was damit zu tun hat, aber genaugenommen hab ich es nicht verstanden.
Also erklär ich mal was ich eigentlich will: 1. Das Programm soll nur einmal gestartet werden können. 2. Startet der Anwender das Programm nochmal soll die zuert gestartete Instanz aktiviert werden, und zwar in dem Zustand wie sie den Focus abgegeben hat. Ergebnis des Quelltextes: zu 1. Funktioniert einwandfrei. (den Quelltext dazu hab ich allerdings auch nur hier im Forum abgeschrieben :oops:) zu 2: Ist die Anwendung nur von einem anderen Programm verdeckt, funktioniert alles wie gewünscht, auch wenn 'meine' Anwendung maximiert war. War meine Anwendung, also der erste Aufruf, minimiert (was wohl häufig vorkommt: Fenster/Anwendung minimieren um zu sehen was dahinterliegt) funktioniert das ganze ja auch noch: Die ursprüngliche Instanz wir wiederhergestellt und erhät den Focus, läßt sich aber jetzt Nicht mehr minimieren. Wenn man auf den Butten in der Fensterleiste drückt, passiert einfach nichts mehr :evil: P.S. Konnte das Verhalten inzwischen auf einem anderen PC ausprobieren: genau das gleiche! d.h. der Quelltext macht die Anwendung kaputt! Bin für jede Info dankbar :!: |
Re: Minimieren geht nicht mehr
genau das was ich dachte. Wenn du bei deinem Form auf den minimieren-button klickst wird Applicaiton.Minimize ausgelöst (alle Forms werden somit minimiert). Wenn du aber mit deinen Messages nicht über das Application.Handle gehst passieren eben die tollen Effekte. Nimm einfach eine eigene Message und rufe beim Aufruf dieser Message Application.Restore auf.
|
Re: Minimieren geht nicht mehr
Vielen Dank für den Hinweis. Jetzt funktioniert es wie es soll! :dancer:
Delphi-Quellcode:
Wenn ich allerdings ganz ehrlich bin, hab ich die Lösung mehr durch probieren als durch Verstehen gefunden.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; const CM_aktivieren=WM_APP+400; type TForm1 = class(TForm) private procedure CMtest(var Message: TMessage); message CM_aktivieren; public end; var Form1: TForm1; Handle: THandle; implementation {$R *.DFM} procedure TForm1.CMtest(var Message: TMessage); begin Application.Restore; end; initialization begin Handle:= CreateMutex(nil, true, 'Form1'); if GetLastError=ERROR_ALREADY_EXISTS then Halt; end; finalization begin if Handle<>0 then CloseHandle(Handle); Handle:= FindWindow(nil, 'Form1'); SetForegroundWindow(Handle); SendMessage(Handle, CM_aktivieren, 0, Handle); end; end. Aber was soll's, das Ergebnis zählt. Jetzt muss ich 'nur' noch dafür sorgen, daß nicht der ganze Fenstertitel (meistens ja nicht vollständig bekannt) benötigt wird. |
Re: Minimieren geht nicht mehr
ok, ich versuchs das nächste mal verständlicher, eventuell mit Beispiel, zu formulieren.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 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 by Thomas Breitkreuz