Einzelnen Beitrag anzeigen

rakekniven

Registriert seit: 4. Apr 2008
Ort: Franken
82 Beiträge
 
Delphi XE5 Professional
 
#14

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 29. Jul 2009, 07:28
Zitat von Luckie:
Zitat von rakekniven:
Unser Fenster läuft Fullscreen ohne Border und Icons. Ist es dann noch ein Toplevel-Fenster?
Ja, dann ist es ein Toplevel Fenster.
Bei meiner Recherche habe ich den Begriff "toplevel" gefunden und dass nur solche Anwendungen Windows-Messages wie WM_POWERBROASCAST empfangen können. Mein Testprogramm ist Form1.Align:=alClient und Form1.BorderIcons:=[].
Darauf habe ich einen Test-Button der die Message sendet. Darauf reagiert meine Prozedur

Delphi-Quellcode:
procedure WMPowerBroadcast(var Msg:TWMPower);
  message WM_POWERBROADCAST;


procedure TForm1.WMPowerBroadcast(var Msg:TWMPower);
begin
  Msg.Result:=BROADCAST_QUERY_DENY;
  ShowMessage('procedure TForm1.WMPowerBroadcast(var Msg:TWMPower);');
end;
wenn ich den Test-Button im Programm drücke, aber nicht wenn ich den PowerButton drücke und auch nicht, wenn ich den "Ausschalten"-Button drücke, der auf Start > Computer ausschalten... erscheint (wie weiter oben jmd schrieb).



Eine andere Empfangs-Prozedur, die ich in meiner Nachforschung entdeckt habe ist:

Delphi-Quellcode:
procedure wndproc(var msg:Tmessage);
begin
  inherited;
  if msg.msg = WM_POWERBROADCAST then
  begin
    ShowMessage('procedure wndproc(var msg:Tmessage);');
    msg.result:=BROADCAST_QUER_DENY;
  end;
end;
Diese wird beim manuellen senden der Message gar nicht erst aufgerufen. Verwende ich WndProc falsch oder überschreibe ich sie nicht richtig?



Zitat von himitsu:
Wenn die Powertaste abgestellt wurde, dann wird doch auch keine WM_POWERBROADCAST-Botschaft verschickt, da dann ja nichts passiert.

WM_POWERBROADCAST ist nur eine Reaktion auf das Drücken des Tasters oder auf irgendwas, welches den PC z.B. runterfahren will ... diese Nachricht hat also nix mit der Taste selber zu tun.

Das drücken des Gehäuse-Power-Knöpfchens dürfte eher irgendeinen Interupt auslösen und an den kommt man wohl nur über einen Treiber?
Auf dem Delphi-PC habe ich die Taste so eingestellt, dass das Auswahl-Menü erscheint, damit ich merke, ob die Taste reagiert hat. Diese Einstellung ist im Grund aber egal, da auf den Druck der Taste reagiert werden soll und nicht auf eines der möglichen Events.
Wie weiter oben in diesem Post genauer beschrieben, reagiert das Programm aber auch nicht, wenn ich auf "Ausschalten" gehen und somit, laut deiner Aussage, das WM_POWERBROADCAST-Event auslöse.


Zitat von hathor:
...oder man fragt den Embedded Controller direkt ab - das Byte ist aber bei jedem PC/Notebook an einer anderen Stelle, denn es gibt keine Normung.
Zitat von himitsu:
Zitat von hathor:
...oder man fragt den Embedded Controller direkt ab - das Byte ist aber bei jedem PC/Notebook an einer anderen Stelle, denn es gibt keine Normung.
irgendwer muß ja wissen wo es liegt ... das BIOS vielleicht/vermutlich?
Der Power-Taster ist direkt auf das Netzteil verdrahtet (lt. unserem PC-Hersteller). Und das Netzteil ist mit dem Mainboard verbunden. Welcher Chip/Bus das ist, wissen wir nicht genau, aber Windows bekommt es ja mit.

Es gibt eine Message, laut meinen Recherchen-Quellen ist es WM_POWERBROADCAST, was auch schon in einem älteren Thread im Forum (erfolgreich?) in einem ähnlichen Zusammenhang verwendet wurde.

edit:
Dieser Thread ist es: http://www.delphipraxis.net/internal...ht=powerbutton
Frag google
  Mit Zitat antworten Zitat