![]() |
Re: Power button Ereigniss einstellein
So geht det, auf eine der beiden Broadcast-Nachrichten hat windows nicht reagiert wenn ich mich genau erinnere, aber wenn du es so machst haut es hin.
Und dort wo du deine Suspendrequests behandelst kannste auch gleich winamp ansteuern, war so nett dir das gleich mit reinzuhauen, bin ich nicht toll? :-P - Naja auch nur weil ich das schon in der Software drin hatte. Einfach dort doWinampCommand so "doWinampCommand( 40048);" aufrufen. 40048 ist fürn nächsten Track.
Delphi-Quellcode:
Damit dürftest du es hinbekommen, denk daran in den Energieoptionen die Buttonfunktion einzustellen.uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; const PBT_APMQUERYSUSPEND = 0; {Request for permission to suspend.} PBT_APMQUERYSUSPENDFAILED = 2; {Suspension request denied.} PBT_APMSUSPEND = 4; {System is suspending operation.} PBT_APMRESUMECRITICAL = 6; {Operation resuming after critical suspension.} PBT_APMRESUMESUSPEND = 7; {Operation resuming after suspension.} PBT_APMBATTERYLOW = 9; {Battery power is low.} PBT_APMPOWERSTATUSCHANGE = 10; {Power status has changed.} PBT_APMOEMEVENT = 11; {OEM-defined event occurred.} type TMainForm = class(TForm) {...} private procedure WMPOWER( var Message: TMessage); message WM_POWER; procedure WMPOWERBROADCAST( var Message: TMessage); message WM_POWERBROADCAST; procedure doWinampCommand( const i1: integer); public { Public-Deklarationen } end; procedure TMainForm.doWinampCommand( const i1: integer); var h: integer; begin h := FindWindow('Winamp v1.x', nil); sendMessage(h, WM_COMMAND, i1, 0); MainTimerTimer( MainTimer); end; procedure TMainForm.WMPOWERBROADCAST( var Message: TMessage); begin case Message.WParam of PBT_APMQUERYSUSPEND: begin if canSuspend then Message.Result := 1 else Message.Result := BROADCAST_QUERY_DENY; end; else defaultHandler( Message); end; end; procedure TMainForm.WMPOWER( var Message: TMessage); begin case Message.WParam of PWR_SUSPENDREQUEST: Message.Result := PWR_FAIL; else defaultHandler( Message); end; end; Alternativ kannst du die Powerbuttonfunktion auch auf beenden lassen und die Nachricht WM_QUERYENDSESSION abfangen, hat aber den Nachteil, dass manche Programme sich dann bereits beenden. Also machtes so ^ Mfg Volker |
Re: Power button Ereigniss einstellein
Danke nu hab ichs geschafft! hier meine Procedure:
Code:
Da noch ne Meldung kommt, dass der pc nicht in den Standbymodus schalten konnte musste ich nur noch die wegklicken lassen:)) nun funzt die sache
unit Unitapm;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, APM, ExtCtrls; const PBT_APMQUERYSUSPEND = 0; {Request for permission to suspend.} PBT_APMQUERYSUSPENDFAILED = 2; {Suspension request denied.} PBT_APMSUSPEND = 4; {System is suspending operation.} PBT_APMRESUMECRITICAL = 6; {Operation resuming after critical suspension.} PBT_APMRESUMESUSPEND = 7; {Operation resuming after suspension.} PBT_APMBATTERYLOW = 9; {Battery power is low.} PBT_APMPOWERSTATUSCHANGE = 10; {Power status has changed.} PBT_APMOEMEVENT = 11; {OEM-defined event occurred.} type TForm1 = class(TForm) procedure WMPOWER( var Message: TMessage); message WM_POWER; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure doWinampCommand( const i1: integer); var h: integer; begin h := FindWindow('Winamp v1.x', nil); sendMessage(h, WM_COMMAND, i1, 0); end; procedure SysFoucs(hWnd:integer); begin setfocus(hWnd); SetwindowPos(hwnd,HWND_BOTTOM,0,0,0,0,0); end; procedure TForm1.WMPOWER( var Message: TMessage); var hWnd:integer; begin case Message.WParam of PWR_SUSPENDREQUEST: Message.Result := PWR_FAIL; else defaultHandler( Message); end; doWinampCommand(40048); hWnd:=FindWindow(pchar('#32770'),nil); SysFoucs(hWnd); keybd_event(Ord(13), 0, 0, 0); end; end. Danke vielmals!!!! Das rult ez voll ab ez kann ich voll locker da liegen und lieder swtichen :)) geil thx! Das mit winamp is ja geil ich habs vor her so gelöst gehabt: Man musste mit der Maus auf Winamp fahren ne Tastenkombination drücken dann wurde die Klasse von Windamp gespeichert. Eine 2te instnaz (beim canSuspend) suchte dann mit findwindow nach dem Winamp fenster und machte es mit setfocus aktiv und simulierte dort einen keybd_event und zwar den Buchstaben "B" (der is ja in winamp für das nexte lied) aber als ich sah dass dies auch mit einer Zeile geht :) hab ich s natürlich sofort so gemacht wie du es gecodet hast!! |
Re: Power button Ereigniss einstellein
Machstes noch so, dann ists korrekt.
procedure TForm1.WMPOWER( var Message: TMessage); var hWnd:integer; begin case Message.WParam of PWR_SUSPENDREQUEST: begin doWinampCommand(40048); hWnd:=FindWindow(pchar('#32770'),nil); SysFoucs(hWnd); keybd_event(Ord(13), 0, 0, 0); Message.Result := PWR_FAIL; end; else defaultHandler( Message); end; end; Viel Spass damit. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 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