![]() |
WM_QUERYENDSESSION in Klasse verwenden
Hallo,
es soll so sein, dass erst nach der Eingabe eines Passwortes Windows runterfahren soll. Wenn ich die Procedure:
Delphi-Quellcode:
innerhalb von TForm deklariere wird sie auch ausgelöst und es funktioniert wie es soll.
procedure WMQÚERYENDSESSION (var msg: TMessage); message WM_QUERYENDSESSION;
z.B.:
Delphi-Quellcode:
allerdings wenn man die Procedure in eine Klasse unterbringt wird das Event nicht ausgelöst.
type
TfrmCPTestProgramm = class(TForm) TrayIcon1: TTrayIcon; PopupMenu1: TPopupMenu; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Beenden1Click(Sender: TObject); private // ----------------------------------------------------------------------------- procedure WMQÚERYENDSESSION (var msg: TMessage); message WM_QUERYENDSESSION; // ----------------------------------------------------------------------------- procedure ONWinEnde(Sender : TObject; var canWinClose: boolean); public prg_ende: Boolean; WinClose: TWinEndeClass; end; implementation {$R *.dfm} procedure TfrmCPTestProgramm.FormCreate(Sender: TObject); begin WinClose:= TWinEndeClass.Create(self); WinClose.ONWinCloseQuery := ONWinEnde; Prg_Ende:= FALSE; TrayIcon1.Visible:= True; end; procedure TfrmCPTestProgramm.ONWinEnde(Sender : TObject; var canWinClose: boolean); var r: Integer; begin r:= MessageBox(0,'Runterfahren ','Achtung ich will runterfahren ',MB_YESNO); if r= IDYES then begin ShowMessage (' ONWinEnde Das Programm wird runtergefahren'); canWinClose:= TRUE; end else begin ShowMessage ('ONWinEnde Das Programm wird nicht runtergefahren'); canWinClose:= FALSE; end; end; procedure TfrmCPTestProgramm.WMQÚERYENDSESSION(var msg: TMessage); var test: Boolean; begin if msg.msg = WM_QUERYENDSESSION then begin if Assigned(WinClose.FONWinCloseQuery) then begin WinClose.FONWinCloseQuery(self, Test); end; end; if Test then begin msg.RESULT:= integer(TRUE); end else begin msg.RESULT:= integer(FALSE); end; end; z.B.:
Delphi-Quellcode:
Kann mir jemand sagen, warum das Event innerhalb einer Klasse nicht verarbeitet werden kann?
type
TWinCloseQueryEvent = procedure(Sender: TObject; var WinCanClose: Boolean) of object; TWinEndeClass = class(TControl) private FONWinCloseQuery: TWinCloseQueryEvent; procedure WMQÚERYENDSESSION (var msg: TMessage); message WM_QUERYENDSESSION; public constructor Create (Owner: TComponent); override; destructor Destroy; override; property ONWinCloseQuery: TWinCloseQueryEvent read FONWinCloseQuery write FONWinCloseQuery; end; { TWinEndeClass } constructor TWinEndeClass.Create(Owner: TComponent); begin inherited Create (Owner); end; destructor TWinEndeClass.Destroy; begin inherited Destroy; end; procedure TWinEndeClass.WMQÚERYENDSESSION(var msg: TMessage); var test: Boolean; begin if msg.msg = WM_QUERYENDSESSION then begin if Assigned(FONWinCloseQuery) then begin FONWinCloseQuery(self, Test); end; end; if Test then begin msg.RESULT:= integer(TRUE); end else begin msg.RESULT:= integer(FALSE); end; end; Bis bald Chemiker |
AW: WM_QUERYENDSESSION in Klasse verwenden
Blind würde ich sagen, dass du ein TWinControl brauchst.
|
AW: WM_QUERYENDSESSION in Klasse verwenden
Hallo WM_Close,
das habe ich auch schon probiert, das Event wird nicht verarbeitet. Bis bald Chemiker |
AW: WM_QUERYENDSESSION in Klasse verwenden
Du musst sicherstellen, daß die Klasse auch die Message bekommt. Das wird, wenn überhaupt nur gehen, wenn Sie ein WinControl auf einem Formular ist.
Warum muss es denn unbedingt diese Klasse sein? |
AW: WM_QUERYENDSESSION in Klasse verwenden
Hallo Uwe Raabe,
Zitat:
Zitat:
Zitat:
Bis bald Chemiker |
AW: WM_QUERYENDSESSION in Klasse verwenden
Du brauchst ein Toplevel Fenster. Windows verschickt die Nachricht nur an Toplevel Fenster. Aber eventuell solltest du ditr noch mal ShutdownBlockReasonCreate angucken und das lesen:
![]() Aber was hindert mich daran den Resetknopf zu drücken? |
AW: WM_QUERYENDSESSION in Klasse verwenden
@Luckie: Dein gesunder Menscheverstand?
Das müsste doch auch mit MessageOnly fenstern funktionieren, oder?(Weiss nicht wie die genau heißen). |
AW: WM_QUERYENDSESSION in Klasse verwenden
@Luckie: der Schrank wo der Rechner eingeschlossen wurde? (Kiosk-System)
|
AW: WM_QUERYENDSESSION in Klasse verwenden
Hallo,
@Luckie: Der Rechner ist nicht für jeden zugänglich nur die Tastatur und der Bildschirm. Leider muss man in einem Unternehmen zu solchen Mittel greifen. Das gleiche betrifft die Application, die erste Änderung nach dem sie 2 Wochen gelaufen war, dass man verhindert, dass sie mehr als 1 Mal gestartet wird. Daran habe ich beim Erstellen überhaupt nicht gedacht, weil es überhaupt keinen Sinn macht. Genau so ist es jetzt mit dem runterfahren von Windows. @WM_CLOSE: MessageOnly Fenster, keine Ahnung was Du darunter verstehst. Dass Form ist ja da, es ist nur unsichtbar. Es geht nur darum, ob man die Message in einer Klasse kapseln kann. @Sir Rufo: Genau der Rechner ist unter Verschluss. Bis bald Chemiker |
AW: WM_QUERYENDSESSION in Klasse verwenden
![]() Du müsstest also ein Fenster innerhalb deiner Klasse erzeugen (kein TForm sondern ein Windows-Fenster), das die Message für dich empfängt. Außerdem stellt sich bei mir gerade die Frage, ob es nun dein Formular ist das die Message empfängt oder die Applikation (TApplication?) Siehe dazu: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09: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-2025 by Thomas Breitkreuz