[gelöst] Wie OpenDialog schließen wenn Energiesparmodus?

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 54
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

[gelöst] Wie OpenDialog schließen wenn Energiesparmodus?

Beitrag von Jorg3000 »

Guten Morgen!
Meine Frage bezieht sich auf Windows.

Ich möchte einen FileDialog (TOpenDialog/TSaveDialog), der gerade per .Execute() in einer Modalschleife angezeigt wird,
durch ein Ereignis schließen, in meinem Fall wenn Windows in den Standby/Suspend-Modus wechselt.

Die Behandlung des WM_POWERBROADCAST habe ich im Haupt-Form erfolgreich umgesetzt (PBT_APMSUSPEND, PBT_APMSTANDBY).
Ich nutze es ursprünglich, um einen im Programm angemeldeten Benutzer auszuloggen. Funktioniert bestens.
Doch einen evtl. zu dem Zeitpunkt aktiven OpenDialog kriege ich nicht geschlossen. Ich habe folgendes ausprobiert ...

Code: Alles auswählen


Dialog.UserChoice:=mrCancel;

Dialog.Close;  // oder .DoClose

Windows.CloseHandle(Dialog.Handle);

All diese Sachen bringen keinen Erfolg, weder einzeln noch zusammen. Das Dialogfenster bleibt.

Möglicherweise ist es ein Problem unter Windows, da im Source von TFileDialog kommentiert ist, dass Windows seine eigene Modalschleife verwendet.
Deshalb hatte ich es mit CloseHandle() versucht, aber ohne Erfolg.

Jemand eine Idee?
Danke und Grüße,
Jörg
Zuletzt geändert von Jorg3000 am Di 17. Mai 2022, 17:19, insgesamt 1-mal geändert.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 54
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Wie OpenDialog schließen wenn Energiesparmodus?

Beitrag von Jorg3000 »

PS: Mir fällt gerade ein, dass das Handle eine Fensterhandle sein könnte und ich ihm irgendeine Close-Message schicken könnte.
Hat dazu gerade jemand Code zur Hand?

PPS:
Funktioniert leider auch nicht ...
PostMessage(Dialog.Handle,WM_CLOSE,0,0); // auch nicht mit WM_QUIT

sstvmaster
Beiträge: 521
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.2
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Wie OpenDialog schließen wenn Energiesparmodus?

Beitrag von sstvmaster »

Mit

Code: Alles auswählen

keybd_event(VK_ESCAPE, VK_ESCAPE ,0,0); 
könnte es funktionieren.
Du drückst sozusagen 1x die Escape Taste. Und vielleicht noch prüfen ob das Handle vom OpenDialog noch gültig ist.

Beispiel im Anhang.
Dateianhänge
project1.zip
(105.54 KiB) 17-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 2.2.2 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.3 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 54
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Wie OpenDialog schließen wenn Energiesparmodus?

Beitrag von Jorg3000 »

Hi!
Besten Dank für die Idee mit der ESC-Taste!

Habe gerade gelesen, dass keybd_event() an das aktive Fenster sendet. Es könnte aber eine andere Anwendung aktiv sein.
Deshalb muss ich den Tastendruck direkt an Dialog.Handle schicken. Probiere ich mal aus.
Grüße
Zuletzt geändert von Jorg3000 am Di 17. Mai 2022, 17:19, insgesamt 1-mal geändert.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 54
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Wie OpenDialog schließen wenn Energiesparmodus?

Beitrag von Jorg3000 »

Aber jetzt ... Lösung ...
Das FileDialog.Handle ist kein Fensterhandle, deshalb hatten alle PostMessage-Versuche nicht funktioniert.

So klappt's ...

Code: Alles auswählen

var h: HWND;  
    ws: UnicodeString;

  ws:=Dialog.Title;    
  h:=FindWindowW(nil,PWChar(ws)); 
  if h<>0 then PostMessage(h,WM_CLOSE,0,0);
Damit man systemweit das richtige Dialogfenster findet und nicht einen zufällig gleich betitelten Dialog eines anderen laufenden Programms, stelle ich sicher, dass mein Dialog.Title möglichst ungewöhnlich/einzigartig ist.

Und Danke nochmal für die Idee mit der ESC-Taste. Dies habe ich jetzt doch nicht genommen, da für WM_KEYDOWN und WM_KEYUP zwei PostMessages nötig gewesen wären.
Grüße, Jörg

Antworten