AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi PowerButton-Event von Windows abfangen und auswerten
Thema durchsuchen
Ansicht
Themen-Optionen

PowerButton-Event von Windows abfangen und auswerten

Ein Thema von rakekniven · begonnen am 28. Jul 2009 · letzter Beitrag vom 29. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
rakekniven

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

PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 15:43
Hallo,

ich will bei einer Maschine mit einem Industrie-PC (Emb. Win XP) verhindern, dass dieser herunterfährt, wenn man den Netzschalter (auf der Front) drückt.

Bisher habe ich herausgefunden, dass das Event WM_POWERBROADCAST heißt und nur an die Top-Level-Anwendungen verschickt wird, weshalb ich bei meinem Programm einen global hook installieren muss.
Dafür habe ich dieses Tutorial verwendet: http://www.delphi-treff.de/tutorials...tastatur-hooks

In meiner .exe wird im FormCreate InstallHook aufgerufen sowie in FormDestroy UninstallHook, die beide aus der .dll vom Tutorial stammen:

Delphi-Quellcode:
library KeyboardHook;

uses
  Windows,
  Messages;

var
  HookHandle: Cardinal = 0;
  WindowHandle: Cardinal = 0;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):
LRESULT; stdcall;
begin
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit;
    FALSE:
      begin
          sleep(10);
      end;
  end;
end;

function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
begin
  Result := False;
  if HookHandle = 0 then begin
    HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc,
    HInstance, 0);
    WindowHandle := Hwnd;
    Result := TRUE;
  end;
end;

function UninstallHook: Boolean; stdcall;
begin
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

exports
  InstallHook,
  UninstallHook;
end.
Kompiliere ich dann beides zusammen und drücke den Netzschalter, passiert nichts.
Wenn ich einen zusätzlichen Button mache, der WM_POWERBROADCAST sendet

SendMessage(HWNC_BROADCAST,WM_POWERBROADCAST,0,0) passiert auch nichts.

Wo liegt mein Fehler?

Oder muss man einen anderen Weg nehmen?

Gruß
Frag google
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 15:52
Was soll auch passieren? In deiner KeyboardHookProc machst du ja nichts. Und ob ein KeyboardHook der passende Hook ist, weiß ich nicht. Der Powerknopf am Gehäuse gehört ja nicht zur Tastatur. Und warum ist dein Fenster kein Toplevel Fenster, wenn es eine Form hat?

Davon mal abgesehen, was machst du, wenn der Netzschalter zum ausschalten benutzt wird oder wenn das Netzkabel gezogen wird? Das Auschalten wirst du nicht verhindern können.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Kalfany

Registriert seit: 28. Feb 2008
Ort: München
153 Beiträge
 
Delphi 2007 Professional
 
#3

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 16:15
Darf der PC nur unter bestimmten Umständen nicht über den Power-Knopf heruntergefahren werden oder gilt das immer? für das zweite ließe sich das auch über Windows regeln ...

Systemsteuerung -> Energieoptionen -> Erweitert -> "Beim Drücken des Netzschalters am Computer"

Wobei du das Ausschalten mit "lang drücken" nicht verhindern kannst außer das BIOS lässt da irgendwelche Optionen zu.

Edit: und falls du es wirklich über die Message im eigenen Programm machen willst dann eher so:

Delphi-Quellcode:
procedure WMPowerBroadcast(var Msg : TWMPower); message WM_POWERBROADCAST;
.
.
.
procedure TForm1.WMPowerBroadcast(var Msg: TWMPower);
begin
  Msg.Result := BROADCAST_QUERY_DENY;
end;
Miniaturansicht angehängter Grafiken
zwischenablage01_211.jpg  
  Mit Zitat antworten Zitat
worker
(Gast)

n/a Beiträge
 
#4

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 16:32
Zitat von Kalfany:
Systemsteuerung -> Energieoptionen -> Erweitert -> "Beim Drücken des Netzschalters am Computer"
Der entsprechende Registry-Eintrag dazu lautet:
Zitat:
HKCU\Control Panel\PowerCfg\GlobalPowerPolicy\\Policies
Der Wert für 'Nichts machen' wäre bspw.
Zitat:
"Policies"=hex:01,00,00,00,00,00,00,00,03,00,00,00 ,00,00,00,80,00,00,00,00,03,\
00,00,00,00,00,00,80,02,00,00,00,03,00,00,00,00,00 ,00,00,02,00,00,00,03,00,\
00,00,00,00,00,00,02,00,00,00,01,00,00,00,00,00,00 ,00,02,00,00,00,01,00,00,\
00,00,00,00,00,01,00,00,00,03,00,00,00,02,00,00,00 ,04,00,00,c0,01,00,00,00,\
04,00,00,00,01,00,00,00,0a,00,00,00,00,00,00,00,03 ,00,00,00,01,00,01,00,01,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ,00,00,00,00,02,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ,00,00,00,03,00,00,00,00,\
00,d6,ff,12,00
  Mit Zitat antworten Zitat
rakekniven

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

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 16:47
Zitat von Kalfany:
Darf der PC nur unter bestimmten Umständen nicht über den Power-Knopf heruntergefahren werden oder gilt das immer? für das zweite ließe sich das auch über Windows regeln ...

Systemsteuerung -> Energieoptionen -> Erweitert -> "Beim Drücken des Netzschalters am Computer"

Wobei du das Ausschalten mit "lang drücken" nicht verhindern kannst außer das BIOS lässt da irgendwelche Optionen zu.
Diese Einstellungen kannten wir schon. Wir möchten einfach keine Windows-Dialoge im Vordergrund haben.
Unsere Anwendung läuft Fullscreen ohne Taskleiste.
Die Powertaste haben wir in Windows abgestellt ("Nichts machen") möchten aber die Nachricht dass die Taste gedrückt wurde selbst auswerten und einen eigenen Abfragedialog anzeigen.

Edit: und falls du es wirklich über die Message im eigenen Programm machen willst dann eher so:

Delphi-Quellcode:
procedure WMPowerBroadcast(var Msg : TWMPower); message WM_POWERBROADCAST;
.
.
.
procedure TForm1.WMPowerBroadcast(var Msg: TWMPower);
begin
  Msg.Result := BROADCAST_QUERY_DENY;
end;
Der Student wird morgen gleich "weiterforschen".

Danke und Gruß
Frag google
  Mit Zitat antworten Zitat
worker
(Gast)

n/a Beiträge
 
#6

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 16:50
Lies Dir meinen Beitrag durch; dann brauchst Du keinen Dialog im Vordergrund (sofern Du Zugriff auf die Registry hast).
  Mit Zitat antworten Zitat
rakekniven

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

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 16:51
Zitat von Luckie:
Was soll auch passieren? In deiner KeyboardHookProc machst du ja nichts. Und ob ein KeyboardHook der passende Hook ist, weiß ich nicht. Der Powerknopf am Gehäuse gehört ja nicht zur Tastatur.
Sorry, wahrscheinlich ist da ein Copy&Paste-Fehler passiert.

Zitat von Luckie:
Und warum ist dein Fenster kein Toplevel Fenster, wenn es eine Form hat?
Unser Fenster läuft Fullscreen ohne Border und Icons. Ist es dann noch ein Toplevel-Fenster?

Zitat von Luckie:
Davon mal abgesehen, was machst du, wenn der Netzschalter zum ausschalten benutzt wird oder wenn das Netzkabel gezogen wird? Das Auschalten wirst du nicht verhindern können.
Der PC hat keinen Netzschalter und das Netzkabel ist nicht zugänglich.
Es ist ein Maschinensteuerungs-PC. In meinem vorherigen Posting habe ich etwas mehr dazu geschrieben.

Danke und Gruß
Frag google
  Mit Zitat antworten Zitat
rakekniven

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

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 16:54
Zitat von worker:
Lies Dir meinen Beitrag durch; dann brauchst Du keinen Dialog im Vordergrund (sofern Du Zugriff auf die Registry hast).
Der Windows-Dialog soll nicht erscheinen. Dazu haben wir Deine Einstellung schon gemacht. Zugriff auf die Registry haben wir, aber wir möchten doch einen eigenen Dialog, den es schon gibt und über einen Button aufgerufen wird, anzeigen.

Gruß

P.S. Diese Anforderung zum Handling ist speziell, wie gesagt es ist eine Maschinensteuerung. Doch das auswerten der Windows-Message beim Drücken des Power-Knopfes sollte doch eine normale Programmiersache sein, oder?
Frag google
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#9

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 17:00
Du kannst auch diese Einstellung wieder zurücksetzen und dann das OnCloseQuery-Event auswerten. Zum Beispiel standardmäßig False (glaub ich) zurückgeben, und dem User einen Dialog präsentieren. Wenn er das dann doch möchte, kannst du das Herunterfahren wieder anstoßen

P.S.: imho sollte das Teil ein Top-Level-Fenster sein, auch ohne Titelleiste und Border - top-level schließt vor allem die ganzen kleinen dinger (buttons, edits, usw.) aus...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: PowerButton-Event von Windows abfangen und auswerten

  Alt 28. Jul 2009, 21:35
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 13:54 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