AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WM_QUERYENDSESSION ohne Fenster

Ein Thema von blablab · begonnen am 27. Okt 2012 · letzter Beitrag vom 16. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2      
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#1

WM_QUERYENDSESSION ohne Fenster

  Alt 27. Okt 2012, 17:27
Hallo!

Ich habe ein Programm von der Art:
Delphi-Quellcode:
program

begin
   while True do
      ...
   end;
end.
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.
Aber ich fände es jetzt irgendwie komisch ein leeres Fenster zu "designen" das sowieso niemals sichtbar wird...

Grüße
blablab
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: WM_QUERYENDSESSION ohne Fenster

  Alt 27. Okt 2012, 17:48
Versuch dir mal folgende Frage zu beantworten: "Warum wählte Microsoft für sein Betriebssystem den Namen Windows?"

Danach ist deine Frage auch beantwortet
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: WM_QUERYENDSESSION ohne Fenster

  Alt 27. Okt 2012, 18:50
Stichwort:
http://docwiki.embarcadero.com/Libra...s.AllocateHWnd
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: WM_QUERYENDSESSION ohne Fenster

  Alt 27. Okt 2012, 19:15
Quasi ein MessageOnlyWindow verwenden. (unsichtbar und nur für den Nachrichtenempfang)

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.
$2B or not $2B
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: WM_QUERYENDSESSION ohne Fenster

  Alt 15. Nov 2012, 22:49
Ich hab folgendes Testprogramm, aber bekomme keine Messages:
Delphi-Quellcode:
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.
Was mach ich falsch?

Edit:
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.
Ich hab jetzt versucht eine MessageLoop zu improvisieren (hab sowas noch nie gemacht) und ich bekomme jetzt Messages. Aber wozu brauche ich denn jetzt das AllocateHWnd?

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?

Geändert von blablab (15. Nov 2012 um 23:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: WM_QUERYENDSESSION ohne Fenster

  Alt 16. Nov 2012, 00:34
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 ... 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.
Bei Google suchenWM_QUERYENDSESSION wird aber, soweit ich das verstanden hab, nur an alle Top-Level-Windows in Desktop-Apps gesendet, also wohl nicht an Services und Co.


http://msdn.microsoft.com/en-us/libr.../ms644927.aspx
Abschnitt "Message Handling" ... Hier im Forum suchenGetMessage usw.
$2B or not $2B

Geändert von himitsu (16. Nov 2012 um 00:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: WM_QUERYENDSESSION ohne Fenster

  Alt 16. Nov 2012, 00:58
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: WM_QUERYENDSESSION ohne Fenster

  Alt 16. Nov 2012, 04:46
Vielen Dank!
Es funktioniert jetzt und ich hab es auch (so ziemlich ) verstanden.

@Bummi:
Delphi-Quellcode:
  if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then
   begin
       PeekMessageA(Msg, 0, 0, 0, PM_REMOVE);
warum nicht nur einmal:

  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: WM_QUERYENDSESSION ohne Fenster

  Alt 16. Nov 2012, 09:35
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).
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: WM_QUERYENDSESSION ohne Fenster

  Alt 16. Nov 2012, 09:54
@blablab
weil ich müde war und beim reduzieren nicht aufgepasst habe...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:04 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