Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WM_QUERYENDSESSION in Klasse verwenden (https://www.delphipraxis.net/158945-wm_queryendsession-klasse-verwenden.html)

Chemiker 8. Mär 2011 19:42

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:
procedure WMQÚERYENDSESSION (var msg: TMessage); message WM_QUERYENDSESSION;
innerhalb von TForm deklariere wird sie auch ausgelöst und es funktioniert wie es soll.
z.B.:
Delphi-Quellcode:
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;
allerdings wenn man die Procedure in eine Klasse unterbringt wird das Event nicht ausgelöst.
z.B.:
Delphi-Quellcode:
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;
Kann mir jemand sagen, warum das Event innerhalb einer Klasse nicht verarbeitet werden kann?
Bis bald Chemiker

WM_CLOSE 8. Mär 2011 19:46

AW: WM_QUERYENDSESSION in Klasse verwenden
 
Blind würde ich sagen, dass du ein TWinControl brauchst.

Chemiker 8. Mär 2011 19:50

AW: WM_QUERYENDSESSION in Klasse verwenden
 
Hallo WM_Close,

das habe ich auch schon probiert, das Event wird nicht verarbeitet.

Bis bald Chemiker

Uwe Raabe 8. Mär 2011 20:08

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?

Chemiker 8. Mär 2011 20:34

AW: WM_QUERYENDSESSION in Klasse verwenden
 
Hallo Uwe Raabe,

Zitat:

Du musst sicherstellen, daß die Klasse auch die Message bekommt.
Das ist klar, aber wie stellt man das Sicher?
Zitat:

Das wird, wenn überhaupt nur gehen, wenn Sie ein WinControl auf einem Formular ist.
Wenn ich die Klasse von WinControl ableite geht’s auch nicht.
Zitat:

Warum muss es denn unbedingt diese Klasse sein?
Das ist eine gute Frage, vllt einfach um zu sehen ob es nicht auch innerhalb einer Klasse funktioniert.
Bis bald Chemiker

Luckie 8. Mär 2011 23:01

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: http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx

Aber was hindert mich daran den Resetknopf zu drücken?

WM_CLOSE 9. Mär 2011 06:39

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).

Sir Rufo 9. Mär 2011 06:48

AW: WM_QUERYENDSESSION in Klasse verwenden
 
@Luckie: der Schrank wo der Rechner eingeschlossen wurde? (Kiosk-System)

Chemiker 9. Mär 2011 13:55

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

WM_CLOSE 9. Mär 2011 14:06

AW: WM_QUERYENDSESSION in Klasse verwenden
 
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx Das meinte ich.
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: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 Uhr.
Seite 1 von 2  1 2      

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