Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Power button Ereigniss einstellein [gelöst] (https://www.delphipraxis.net/14994-power-button-ereigniss-einstellein-%5Bgeloest%5D.html)

CTV 20. Jan 2004 10:43


Power button Ereigniss einstellein [gelöst]
 
Moin

Man kann ja in der Systemsteuerung bei den Energie optionen unter Erweitert einstellen was passieren soll wenn der Powerknopf gedürckt wird.

Bei mir gibt es diese beiden optionen:
"Ausschalten"
"Standbymodus"

Meine Frage ist es nun kann man auch noch andere Ereignisse hinzufügen ?
Z.B. wenn der Powerbutton gedückt wird dass dann ein Programm startet oder z.B. dass bei ner Musik CD ein lied weiter geschaltet wird?

ist das möglich ? Wie kann man sowas programmieren ?

Ich hab schon versucht abzufragen wenn windows beendet wird und das closequery auf false zu stellen. Dies funktioniert auch aber nur wenn der Benutzer "Start Beenden" wählt. Nicht aber wenn jemand den power button drückt und desshalb nüzt mir das ganze nichts. Ich währe forh wenn jemand eine idee hat wie man so etwas machen kann.

Mein ziil ist es mit dem Powerknopf bei Winamp ein anderes Lied einzustellen. (ich hab mir einen verlängerten powerknopf gemacht 15m kabel) dass ich bequem von neben an den pc (welcher im serverraum steht) ein und ausschalten kann. Und wenn ich über den sound hören will muss ich immer in den serverraum um das lied um zustellen das ist mühsam darum bin ich auf die idee mit dem power knopf gekommen. Ich hoffe jemand hat eine idde thx

Greetz Cyrus

Nico Lausch 20. Jan 2004 11:24

Re: Power button Ereigniss einstellein
 
Hallo

zu folgenden Abschnitts deines Theards

Zitat:

Zitat von CTV
(ich hab mir einen verlängerten powerknopf gemacht 15m kabel) dass ich bequem von neben an den pc (welcher im serverraum steht) ein und ausschalten kann.

willst du mir sagen das du deinen Rechen denn du im Serverraum zustehen hast immer nur "per Hand" ausmachst ohne ihn runter zufahren?! also bei linux geht sowas ganz schnell schief :angle:

Vjay 20. Jan 2004 11:34

Re: Power button Ereigniss einstellein
 
Also mal ehrlich, hol dir nen infrarot-empfänger und ne fernbedienung, 1000x komfortabler als sowas und kostet nicht die welt.

Zum thema, hab in meinem auto ein laptop eingebaut, welcher über die zündung eingeschaltet wird(relais), wenn der computer läuft soll er durch die zündung nicht wieder ausgeschaltet werden (falls man mal motor abwürgt). powerbuttonfunktion in systemsteuerung auf "schlafen" stellen, dann im programm auf die requestnachricht warten und die anforderung canceln + zusätzlichen code ausführen. gibts sogar ne komponente für die das APM kapselt. TAPM hiess die soweit ich mich erinnere, bei der hatt ich ein bissl geklaut :)

MFG
V.

Robert_G 20. Jan 2004 11:53

Re: Power button Ereigniss einstellein
 
Zitat:

Zitat von CTV
Und wenn ich über den sound hören will muss ich immer in den serverraum um das lied um zustellen das ist mühsam darum bin ich auf die idee mit dem power knopf gekommen

Warum läßt du nicht einfach deine Dateien auf dem Server und spielst sie von deinem Rechner aus ab?
So hast du volle kontrolle über WinAmp oder was auch immer du nutzen willst.

Das mit Powerknopfkabel ist doch jetzt ein Witz, oder? :wiejetzt:
Wenn du ihn von deinem Rechner aus runterfahren willst, dann schreib dir ein kleines Prog., dass das übers Netzwerk kann.
Codebeispiele wirst du hier in der DP schon finden.


@Vjay

Eine Fernbedienung für den Rechner ist eine feine Sache (ich will mir auch eine zulegen), aber mit Infrarot kommst du nicht durch Wände/Hindernisse -> da sollte es schon eine Funkfernbedienung sein.

CTV 20. Jan 2004 12:25

Re: Power button Ereigniss einstellein
 
@Nico Lausch
Nein ich stelle den pc ned so ab, es ist eingestellt dass er in den standbymouds fällt wenn man auf den power knopf drückt.

@Vjay
ich schaue mir die kompo mal an vielleicht gehts mit der ja :)) thx

@all
Ich formuliere mich nun ein wenig genauer wie s scheint ist nicht alles so klar.

Meiner Server und anderen Rechner sind in einem separatem raum von dort aus gehen alle kabel der pcs (maus,tastatur,monitor) and einen kvu switch. vom Kvu swticht gehen kabel (maus,tastatur,monitor) in mein zimmer doet hab ich eine Maus eine Tastatur und einen Bildschirm und keine einzige workstation. Ich kann von dort aus alle pcs kontrollieren und mit der Tastatur von PC zu PC swtichen. Das powerknopf kabel hab ich für eine workstation damit ich den pc auch von dem raum einschalten kann. von dem aus schalte ich dann über wake on lan die anderen an:) so muss ich nicht in den raum. Da meine normalen workstations auch in dem Raum stehen höre ich auch über die Sound (ein kabel kommt vom server raum in mein zimmer an die sterio anlage).

Ich höre oft Musik zum einschlafen, doch ich hab dann keine Lust aufzustehen wenn ein scheiss lied kommt um dies zu ändern. Da hab ich mir überlegt ob es nicht eine Möglichkeit gibt bequem vom bett aus das lied umzustellen. Und da ist mir der Powerknopf eingefallen. Über funk hab ich auch schon nachgedacht jedoch hab ich noch nie was mit funkt gemacht und dann müsste ich noch andere komponenten kaufen. Ich werds wohl so machen müssen ausser es geht auch mit dem powerknopf das währe das idealste so müsste ich an der hardware nix ändern und hätte einfach en tool welches für mich die track umschaltung übernimmt.

Greetz Cyrus

Vjay 20. Jan 2004 12:57

Re: Power button Ereigniss einstellein
 
simple fernbedienung = nichtma 20 euro mit genüg knöppen für nächstes lied ,lied zurück, pc ausschalten, dvdwiedergabe steuern etc etc.

den aufwand den du hier treibst, geh in der zeit jobben und du hast sogar noch kohle übrig ;), ansonsten weisste ja wies geht.

Pseudemys Nelsoni 20. Jan 2004 13:26

Re: Power button Ereigniss einstellein
 
ich hab komfortable 3 optionen was passiert wenn ich den powerbutton drücke :mrgreen:


vjay: kennst du KTT, Anarchnophobia? wenn nicht, vergiss einfach was ich gefragt hab :zwinker:

Vjay 20. Jan 2004 13:28

Re: Power button Ereigniss einstellein
 
Ja, kenn ich, wer bistn du? ;) SilentX2000, noch nie gehört...?

Luckie 20. Jan 2004 13:44

Re: Power button Ereigniss einstellein
 
Private Dinge bitte per PN oder E-Mail klären. Die gehören hier nicht hin. Danke.

CTV 20. Jan 2004 15:32

Re: Power button Ereigniss einstellein
 
ich hab ez ein wenig mit der tamp kompo experimentiert. aber das klapt nicht wirklich. Es ist alles wie wenn gar kein Programm laufen würde. Ich hab versucht beim onStatuschange ein cannel zu machen aber das bring ich irgendwie ned hin.

@Vjay
Kannst du mal einwenig source von dir rein posten, damit ich schauen kann wie das mit dem cancel geht ?

danke

greetz Cyrus

Vjay 20. Jan 2004 20:27

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:

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;
Damit dürftest du es hinbekommen, denk daran in den Energieoptionen die Buttonfunktion einzustellen.

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

CTV 20. Jan 2004 22:36

Re: Power button Ereigniss einstellein
 
Danke nu hab ichs geschafft! hier meine Procedure:

Code:
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.
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

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!!

Vjay 20. Jan 2004 22:57

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 17:42 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