[Q][Gelöst!] Hidden-Form + QueryEndSession

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
TerribleCode
Beiträge: 38
Registriert: Di 18. Nov 2014, 22:50
OS, Lazarus, FPC: Windows 7 [x64]; Lazarus 1.6.4 [i386-win32]; FPC 3.0.2 [win32 i386]
CPU-Target: 64Bit

[Q][Gelöst!] Hidden-Form + QueryEndSession

Beitrag von TerribleCode »

Hey Leute,

folgends:
ich habe mir eine kleine Anwendung gebaut die Regeläßig meine mit Blender gerenderten Bilder sichert. Es ist nähmlich sehr schön zu sehen wie sich die Szenen über die Zeit/Arbeit verändern =)

Nun habe ich eine Funktion eingebaut die Windows am herunterfahren hindert, solange die Bilder noch gesichert werden.

Das klappte auch alles wunderbar, bis ich eine Funktion eingebaut habe mit der man die Application in den Tray minimieren kann.
Dann fährt Windows nähmlich sofort herunter und ignoriert den Rückgabewert von QueryEndSession (Cancel := TRUE)...

Hat jemand das selbe Problem und/oder vielleicht eine Lösung parat?

Ich danke schonmal Herzlichst im vorraus!


Mit freundlichen Grüßen 'TerribleCode'
Zuletzt geändert von TerribleCode am Do 20. Nov 2014, 16:02, insgesamt 1-mal geändert.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: [Q] Hidden-Form + QueryEndSession

Beitrag von Michl »

Erstmal ein herzliches Willkommen im Forum!

Bei mir funktioniert maxi- und minimiert, mit und ohne Focus:
- eine TApplicationProperties auf das Formular
- Eventhandler für OnQueryEndSession erstellen
- und:

Code: Alles auswählen

procedure TForm1.ApplicationProperties1QueryEndSession(
  var Cancel: Boolean);
begin
  Cancel:=True;
end;
Win7 64bit, Lazarus 32bit

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

TerribleCode
Beiträge: 38
Registriert: Di 18. Nov 2014, 22:50
OS, Lazarus, FPC: Windows 7 [x64]; Lazarus 1.6.4 [i386-win32]; FPC 3.0.2 [win32 i386]
CPU-Target: 64Bit

Re: [Q] Hidden-Form + QueryEndSession

Beitrag von TerribleCode »

Danke, echt nice das es ein deutsches Lazarus-Forum gibt!

Nunja... Genau so wie du es beschrieben hast, habe ich es gemacht ^^

Ich minimiere das Fenster mit:

Code: Alles auswählen

Form1.HIDE;
es ist dann auch nicht mehr in der Taskleiste zu sehen (dafür ist ja das Tray-Icon).

Klappt es dann auch noch bei dir?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: [Q] Hidden-Form + QueryEndSession

Beitrag von Michl »

Ja, sorry, war zu schnell mit lesen. In der Tat geht das bei mir dann auch nicht. Ich hatte nur minimiert getestet.

Ich habe noch erfolglos http://stackoverflow.com/questions/2553 ... n-shutdown probiert. Kann Dir da leider nicht helfen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: [Q] Hidden-Form + QueryEndSession

Beitrag von Michl »

So hatte mich doch noch interessiert, warum das nicht ging. Gemäß http://msdn.microsoft.com/en-us/library/ms700677.aspx muss ab Windows Vista eine Api gestartet werden, die von nicht Top-Level-Anwendungen heraus das runterfahren verhindert (das passiert wohl, wenn man das Formular.Hide aufruft).

Folgender Ansatz funktioniert bei mir:
- eine TApplicationProperties auf das Formular
- Eventhandler für OnQueryEndSession erstellen
- und:

Code: Alles auswählen

uses ..., Windows;
 
...
 
function ShutdownBlockReasonCreate(hWnd: HWND; Reason: LPCWSTR): Bool; stdcall; external user32;
function ShutdownBlockReasonQuery(hWnd:HWND; pwszBuff: LPWSTR; pcchBuff: PDWORD): Bool; stdcall; external user32;
function ShutdownBlockReasonDestroy(hWnd: HWND): Bool; stdcall; external user32;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShutdownBlockReasonCreate(Handle, 'Bitte warten, bis alle Daten gespeichert sind!');
  Hide;
  Sleep(30000); //Speichere hier Deine Daten!
  ShutdownBlockReasonDestroy(Handle);
end;
 
procedure TForm1.ApplicationProperties1QueryEndSession(var Cancel: Boolean);
begin
  Cancel:=True;
end; 

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

TerribleCode
Beiträge: 38
Registriert: Di 18. Nov 2014, 22:50
OS, Lazarus, FPC: Windows 7 [x64]; Lazarus 1.6.4 [i386-win32]; FPC 3.0.2 [win32 i386]
CPU-Target: 64Bit

[Gelöst!] Hidden-Form + QueryEndSession

Beitrag von TerribleCode »

Cool, das funktioniert!

Mir ist nur nicht ganz klar was da genau passiert... :oops:
Werde die Tage mal auf die suche gehen, nach Tutorials, zum Thema API´s. :)

Danke Michl, für deine schnelle Hilfe! 8)

Antworten