AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem bei der Verarbeitung von Systemnachrichten
Thema durchsuchen
Ansicht
Themen-Optionen

Problem bei der Verarbeitung von Systemnachrichten

Ein Thema von Johannes Maier · begonnen am 3. Sep 2004 · letzter Beitrag vom 4. Sep 2004
Antwort Antwort
Seite 2 von 2     12   
Golze

Registriert seit: 26. Aug 2004
Ort: Berlin
32 Beiträge
 
Delphi 5 Enterprise
 
#11

Re: Problem bei der Verarbeitung von Systemnachrichten

  Alt 4. Sep 2004, 09:58
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 , 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 . Das geht nur noch mit der im Beispiel genutzten API-Methode
Kay
Kay Golze
Wo Gold ist, muß es auch glänzen.
  Mit Zitat antworten Zitat
Johannes Maier

Registriert seit: 3. Sep 2004
25 Beiträge
 
Delphi 7 Professional
 
#12

Re: Problem bei der Verarbeitung von Systemnachrichten

  Alt 4. Sep 2004, 14:22
Danke Kay

Auch dafür, dass du es nochmal in der PN geschickt hast, sonst hätte ich es vll noch übersehen
Johannes Maier
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#13

Re: Problem bei der Verarbeitung von Systemnachrichten

  Alt 4. Sep 2004, 15:46
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.
  Mit Zitat antworten Zitat
Johannes Maier

Registriert seit: 3. Sep 2004
25 Beiträge
 
Delphi 7 Professional
 
#14

Re: Problem bei der Verarbeitung von Systemnachrichten

  Alt 4. Sep 2004, 16:49
So vielen Dank euch beiden für die ausführlichen Antworten

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
Johannes Maier
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 Uhr.
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