![]() |
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 |
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: |
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. |
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. |
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