![]() |
TPoerbutton ereigniss wird permanent ausgeführt:
Ich hab mal ein Tool gemacht um das Powerbutton peress Ereigniss abzufangen nun wollte ich daraus eine komponente machen: Die funktioniert soweit de pc fährt nicht runter wenn ich die Eigenschaft PowerbuttenEnable auf false stelle .. jedoch wird das ereignis onPowerbottenpress kontinuierlich ausgeführt weiss jemand wieso ?
componenten Ssource:
Delphi-Quellcode:
Diese Proceure: DoPowerbuttonPress sollte eingelich nur dann ausgeführt werden wenn der PB wirklich gedückt wird jedoch wird sie die ganze zeit ausgeführt weis jemand wieso ?
unit PowerButton;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus, ShellApi, ExtCtrls,dialogs; type TPowerButton = class(TComponent) private FHooked: Boolean; FOnPowerbuttonPress : TNotifyEvent; PPowerOffEnable:Boolean; function MessageHook(var Msg: TMessage): Boolean; protected procedure DoPowerbuttonPress; dynamic; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published {events} property OnPowerbuttonPress: TNotifyEvent read FOnPowerbuttonPress write FOnPowerbuttonPress; {properties} property PowerOffEnable : boolean read PPowerOffEnable write PPowerOffEnable; end; procedure Register; implementation const PBT_APMQUERYSUSPEND = 0; {Request for permission to suspend.} procedure Register; begin RegisterComponents('Zusätzlich', [TPowerButton]); end; constructor TPowerButton.create(AOwner : TComponent); begin inherited Create(AOwner); FHooked := False; if not (csDesigning in ComponentState) then begin Application.HookMainWindow(MessageHook); FHooked := True; end; end; Procedure TPowerButton.DoPowerbuttonPress; begin if Assigned(FOnPowerbuttonPress) then FOnPowerbuttonPress(Self); end; function TPowerButton.MessageHook(var Msg: TMessage): Boolean; begin case msg.WParam of PWR_SUSPENDREQUEST: //win2000,XP begin if PPowerOffEnable = false then begin msg.Result := PWR_FAIL; end; DoPowerbuttonPress; end; PBT_APMQUERYSUSPEND: //win95,98 begin if PPowerOffEnable = false then begin msg.Result := BROADCAST_QUERY_DENY; end; DoPowerbuttonPress; end; end; end; destructor TPowerButton.Destroy; begin if FHooked then Application.UnhookMainWindow(MessageHook); inherited Destroy; end; Greetz Cyrus |
Re: TPoerbutton ereigniss wird permanent ausgeführt:
Wenn das Programm startet wird das Ereigniss DoPowerbuttonPress genau 5 mal ausgeführt. Ich hab das mal so getestet:
Delphi-Quellcode:
Wenn ich danach auf den Powerbutton drücke fügt es ein L hinzu und bei weitern druck auf den PB ein weiteres also so wie das sein müsste. Das einzige was noch komisch sit wieso das ereignis 5 mal ausgeführt wird am anfang weiss jemand wieso ?
procedure TForm1.PowerButton1PowerbuttonPress(Sender: TObject);
var s:string; begin s:='L'; label1.Caption:=label1.Caption+s; end; Greetz Cyrus |
Re: TPoerbutton ereigniss wird permanent ausgeführt:
ich hab ez mal das eingebaut:
Delphi-Quellcode:
Nun funktionierts jedoch kann das ja nicht die lösung sein oder ? das ist eher ein gebastel mich nimmts wunder wieso das genau 5 mal ausgeführt wird
..
private i:integer; .. constructor TPowerButton.create(AOwner : TComponent); begin inherited Create(AOwner); i:=1; FHooked := False; if not (csDesigning in ComponentState) then begin Application.HookMainWindow(MessageHook); FHooked := True; end; end ... Procedure TPowerButton.DoPowerbuttonPress; begin if i>5 then begin if Assigned(FOnPowerbuttonPress) then FOnPowerbuttonPress(Self); end; inc(i); end; ... Greetz Cyrus |
Re: TPoerbutton ereigniss wird permanent ausgeführt:
ich ez raus gefunden dass der meine procedure "DoPowerbuttonPress;" jedes mal ausführt wenn meine Applikation eine WinMsg erhält egal welche. Wenn ich z.b die grösse des fensters ändere wird sie auch aus geführt. An was kann das liegen? sie sollte doch wirklich nur dann ausgeführt werden wenn die message diese: PWR_SUSPENDREQUEST oder diese ist: PBT_APMQUERYSUSPEND was läuft da falsch ? hat jemand eine Idee oder einen Verdacht ?
Greetz Cyrus |
Re: TPoerbutton ereigniss wird permanent ausgeführt:
nun bin ich der sache etwas näher gekommen msg.wparam gibt immer 0 aus wenn man den power knopf drückt. ich hab ez mal untersucht was msg.msg ausgibt wenn man den powerknopf drückt. und es gibt bei mir 536 aus nun klapts auch mit dem ereignis wenn ich nähnlich dies hier einfüge:
Delphi-Quellcode:
Meine frage ist nun ist das nur bei mir dieser wet wenn man den button drückt oder ist das beu euch auch so ? Wie ist es bei Win95/98 ??
if (msg.msg=536) and (msg.WParam=0) then
begin DoPowerbuttonPress; end; |
Re: TPoerbutton ereigniss wird permanent ausgeführt:
Problem gelöst!!!!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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-2025 by Thomas Breitkreuz