Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem bei der Verarbeitung von Systemnachrichten (https://www.delphipraxis.net/29070-problem-bei-der-verarbeitung-von-systemnachrichten.html)

Golze 4. Sep 2004 09:58

Re: Problem bei der Verarbeitung von Systemnachrichten
 
Hi, noch ein Hinweis zur Bearbeitung von WM_QUIT.
Johannes nutzt zur Ausgabe einer Messagebox "ShowMessage". Ist ein WM_QUIT-Ereignis eingetroffen, wird verschiedene VCL-Methode nicht mehr ausgeführt :gruebel: , zu diesen zählt auch WM_QUIT. Mit ShowMessage kann ich also generell, egal an welcher Stelle des Programms, keine Messagebox mehr aufblenden, wenn das Programm WM_QUIT empfangen hat :cry: . Das geht nur noch mit der im Beispiel genutzten API-Methode :wall:
Kay

Johannes Maier 4. Sep 2004 14:22

Re: Problem bei der Verarbeitung von Systemnachrichten
 
Danke Kay ;)

Auch dafür, dass du es nochmal in der PN geschickt hast, sonst hätte ich es vll noch übersehen :stupid:

Sprint 4. Sep 2004 15:46

Re: Problem bei der Verarbeitung von Systemnachrichten
 
Hier mal eine Lösung wie du mit SetWindowsHookEx die WM_QUIT Nachricht abfangen kannst.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure SetMsgHook;
    procedure Unhook;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  MsgHook: HHOOK;

{--------------------------------------------------------------------------------------------------}

function GetMsgProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
const
  S_MSG = 'Eine WM_QUIT Nachricht wird an dieses Programm geschickt.' + #13#10 +
          'Soll die Nachricht verarbeitet werden?';
var
  Msg: PMsg;
begin

  if Code = HC_ACTION then
  begin

    Msg := PMsg(lParam);

    if Msg^.message = WM_QUIT then
      if Application.MessageBox(S_MSG, nil, MB_YESNO or MB_ICONINFORMATION) = IDNO then
      begin
        Msg^.message := WM_COMMAND;
        Msg.wParam := WM_NULL;
        Msg.lParam := 0;
        Result := 1;
        Exit;
      end;

  end;

  Result := CallNextHookEx(MsgHook, Code, wParam, lParam);

end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.SetMsgHook;
begin

  if MsgHook <> 0 then
    Exit;

  MsgHook := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, 0, GetCurrentThreadId);

  if MsgHook = 0 then
    Application.MessageBox(PChar(SysErrorMessage(GetLastError)), nil, MB_OK or MB_ICONQUESTION);

end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.Unhook;
begin

  if MsgHook = 0 then
    Exit;

  UnhookWindowsHookEx(MsgHook);
  MsgHook := 0;

end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormCreate(Sender: TObject);
begin

  SetMsgHook;
 
end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormDestroy(Sender: TObject);
begin

  Unhook;

end;

{--------------------------------------------------------------------------------------------------}

end.

Johannes Maier 4. Sep 2004 16:49

Re: Problem bei der Verarbeitung von Systemnachrichten
 
So vielen Dank euch beiden für die ausführlichen Antworten :thumb:

Jetzt noch einmal auf die Frage, wieso ich das brauche:
Ich bin einfach von Natur aus jemand, der, wenn er ein Problem hat, und dieses lösen kann, allerdings nur mit Hilfe einer Formel die er noch nicht kennt, auch wissen will wo diese Formel herkommt usw, bzw. alles über die "näheren Umstände" dieser Formel erfahren will ;) Auf Formel komme ich jetzt nur, da es ein gutes Beispiel für meine Vorgehensweise ist, und ganz nebenbei auch für meine Interessen (Mathematik gehört dazu ;)).
Ich kam auf das Problem mit WM_QUIT nur dadurch, dass ich meinem "Programm" (genaugenommen macht es gar nichts) Systemnachrichten zukommen ließ, da ich aber SendMessage nicht kannte, dies mit PostMessage erledigte. Bis dahin dachte ich, man könne diese mit der WndProc abfangen und verarbeiten, aber das ging nicht, nur mit SendMessage-Nachrichten.
Dann suchte ich dafür eine Lösung, die fand sich mit dem Code ganz oben, als ich dann einmal WM_QUIT sendete (statt WM_CLOSE) ging es plötzlich nicht mehr.
Jetzt da ich weiß, dass es dafür auch eine Lösung gibt und wie sie aussieht, bin ich (fast) zufrieden.
Ich werde mich jetzt nur noch mit den Lösungen beschäftigen um herauszufinden wie sie funktionieren ;) Denn zu wissen, mit welchem Code man ein programmiertechnisches Problem lösen kann, reicht mir nicht aus, ich möchte ihn auch gerne verstehen ;) Brauchen werde ich diesen Code wohl kaum ...
Zum Glück gibt es ja MSDN, um die verschiedenen Systemfunktionen erklärt zu bekommen. Falls ich dann doch irgendetwas dort sprach- oder begriffbedingt nicht verstehen sollte, so gibt es ja immer noch drei Foren, wo ich nachfragen kann ;)

MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.
Seite 2 von 2     12   

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