![]() |
WM_QUERYENDSESSION ohne Fenster
Hallo!
Ich habe ein Programm von der Art:
Delphi-Quellcode:
Wie kann ich da Messages wie WM_QUERYENDSESSION abfangen? Bekomme ich die nur wenn ich ein Fenster habe? Oder reicht eventuell Application? Es muss nicht nonVCL sein, da ich Graphics benutze und somit das VCL sowieso schon mit drin habe.
program
begin while True do ... end; end. Aber ich fände es jetzt irgendwie komisch ein leeres Fenster zu "designen" das sowieso niemals sichtbar wird... Grüße blablab |
AW: WM_QUERYENDSESSION ohne Fenster
Versuch dir mal folgende Frage zu beantworten: "Warum wählte Microsoft für sein Betriebssystem den Namen Windows?"
Danach ist deine Frage auch beantwortet :mrgreen: |
AW: WM_QUERYENDSESSION ohne Fenster
|
AW: WM_QUERYENDSESSION ohne Fenster
Zitat:
Und zusätzlich die MessageLoop nicht vergessen, denn ohne einen Code, welche die MessageQueue verarbeitet, bekommt das Fenster zwar die Message, aber keiner verarbeitet sie und sie leibt in der Queue stecken. :stupid: |
AW: WM_QUERYENDSESSION ohne Fenster
Ich hab folgendes Testprogramm, aber bekomme keine Messages:
Delphi-Quellcode:
Was mach ich falsch?
program WinMsg;
uses Forms, Classes, Messages, SysUtils, Windows; {$R *.res} type TWndProcClass = class protected procedure WndProc(var msg: TMessage); public WinHandle: HWND; end; procedure TWndProcClass.WndProc(var msg: TMessage); begin MessageBox(0, pansichar(inttostr(msg.Msg)), 'msg', 0); end; var WndProcClass: TWndProcClass; begin WndProcClass := TWndProcClass.Create; WndProcClass.WinHandle := AllocateHWnd(WndProcClass.WndProc); while True do begin Sleep(10); end; DeallocateHWnd(WndProcClass.WinHandle); WndProcClass.Free; end. Edit: Zitat:
Edit2: Ok, ich habs jetzt glaub ich so weit verstanden: Es gibt Messages für den Thread und andere für ein Window. Wenn ich also nur eine MessageLoop habe bekomme ich "Thread-Messages" aber keine "Window-Messages". Und scheinbar ist WM_QUERYENDSESSION eine solche "Window-Message". Aber woher weiß ich denn welche Messages der Thread und welche nur ein Window bekommt? Gibt es da vielleicht eine Übersicht oder kennt jemand ein kleines Tutorial? |
AW: WM_QUERYENDSESSION ohne Fenster
Alles, was per PostMessage/PostThreadMessage versendet wird, geht immer über die MessageQueue einen Threads. Alle Fenster und deren Message-Eingang sind mit einem Thread verknubblt ... genauer standardmäßig mit dem Thread, in dessen Kontext dieses "Fenster" (auch ein Edit oder Memo ist "nur" ein Fenster, weswegen Windows auch Windows heißt).
SendMessage geht zwar direkt an die Komponenten, es wird aber dennoch über diesen Thread synchronisiert. Schöne Schleife, die nichts macht, außer zu schlafen und sich im Kreis drehen :zwinker: ... Wo werden da denn die Messages verarbeitet? (in der VCL ist der Code quasi in Application.ProcessMessages versteckt und Dieses mußt du nun alles selber machen) Schau dir mal die Delay-Prozedur in der CodeLib, bzw. im Forum an (da wird oftmals auch eine NonVCL-Version erwähnt) und nahezu sämtliche NonVCL-Tutorials sind auch geeignet, denn dort machen die fast immer alles selber. Derartige Messages gehen oftmals über HWND_BROADCAST raus, was dann an alle Top-Level-Windows gesendet wird. ![]() ![]() Abschnitt "Message Handling" ... ![]() |
AW: WM_QUERYENDSESSION ohne Fenster
eine Minimalversion:
Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE} uses SysUtils,classes,messages,dialogs,windows; type TWndProcClass = class protected procedure WndProc(var msg: TMessage); public WinHandle: HWND; end; Function ProcessMessage(var Msg: TMsg): Boolean; begin Result := False; if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin PeekMessageA(Msg, 0, 0, 0, PM_REMOVE); Result := True; if Msg.Message <> WM_QUIT then begin TranslateMessage(Msg); DispatchMessageA(Msg); end; end; end; procedure ProcessMessages; var Msg: TMsg; begin while ProcessMessage(Msg) do {loop}; end; procedure TWndProcClass.WndProc(var msg: TMessage); begin writeln('MSG:' + inttostr(msg.Msg)); msg.Result := -1; end; var WndProcClass: TWndProcClass; begin WndProcClass := TWndProcClass.Create; WndProcClass.WinHandle := AllocateHWnd(WndProcClass.WndProc); writeln('HWND:' + InttoStr(WndProcClass.WinHandle)); while True do begin Sleep(10); processMessages; end; DeallocateHWnd(WndProcClass.WinHandle); WndProcClass.Free; end. Aufrufbeispiel aus einer anderen Anwendung über das Handle, welches hier bei Writeln ausgegeben wurde
Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
begin sendmessage(2689556,wm_close,0,0) end; |
AW: WM_QUERYENDSESSION ohne Fenster
Vielen Dank!
Es funktioniert jetzt und ich hab es auch (so ziemlich:-D ) verstanden. @Bummi:
Delphi-Quellcode:
warum nicht nur einmal:
if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then
begin PeekMessageA(Msg, 0, 0, 0, PM_REMOVE);
Delphi-Quellcode:
?
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
|
AW: WM_QUERYENDSESSION ohne Fenster
Das Erste stammt quasi noch aus dem Code, wo man auch noch Unicode mit behandelt
Nja, wenn man sowieso nur ales selber macht, reicht es, wenn an das Genutzte Unterstützt. In dem Fall würde ich einfach das A (xxxA) weglassen und alle API-Aufrufe über die dynamischen Typen laufen lassen. Außer man will prozessübergreifend, abeiten, dann entweder ANSI und Unicode verarbeiten oder auf eine Schnittstelle einigen, also ANSI (xxxA) oder Unicode (xxxW). |
AW: WM_QUERYENDSESSION ohne Fenster
@blablab
weil ich müde war und beim reduzieren nicht aufgepasst habe... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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 by Thomas Breitkreuz