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 Hat's einen Akku? (https://www.delphipraxis.net/197828-hats-einen-akku.html)

Mattze 8. Sep 2018 17:35

Hat's einen Akku?
 
Hallo,

wahrscheinlich habe ich es ja nur übersehen, aber ich finde es einfach nicht!

Wie kann man möglichst einfach und kurz (!!!) per Delphi 7 rauskriegen, ob das Gerät vor einem einen Akku hat oder nicht?
Ich meine das ganz allgemein!!!
Bsp.:
1.Wenn der Notebook-Akku draussen ist und das Gerät per Wechselstrom arbeitet, soll auch angezeigt werden, dass kein Akku da ist.
2. Hängt der Laptop am der Strom und ist ein Akku drin, soll auch angezeigt werden, dass der einen Akku hat.
Usw.

(Man kann die Anzahl der vorhandenen Batterien testen - PSP_DEVICE_INTERFACE_DETAIL_DATA. Das ist aber ein ziemlicher Aufwand. Geht das nicht auch kürzer?)

Gruß
Mattze

API 8. Sep 2018 17:42

AW: Hat's einen Akku?
 
Hallo,

Habe kurz gegoogelt, vielleicht hilft das da:

https://stackoverflow.com/questions/...g-on-batteries

Guido R. 8. Sep 2018 18:27

AW: Hat's einen Akku?
 
Hi!

Schau Dir mal tJvComputerInfoEx aus den Jedis an.
Diese hat unter APM diverse Batterie-Eigenschaften, neben Infos zum Ladestatus auch "BatteryFlag"
Vielleicht kannst Du damit etwas anfangen.

Gruß
Guido R.

bnreimer42 8. Sep 2018 20:23

AW: Hat's einen Akku?
 
Ich würde es mit SMBios probieren konkret mit folgendem Beispiel:

https://github.com/RRUZ/tsmbios/tree...%20Information

Viel Erfolg

OLDIE1950 10. Sep 2018 22:38

AW: Hat's einen Akku?
 
Code:
// WinApi command to get the status of the battery.
  if GetSystemPowerStatus(pSysPowerStatus) then
  begin
    // get the line status
    case pSysPowerStatus.ACLineStatus of
      0   : s:='Offline';
      1   : s:='Online';
      255 : s:='Unknown status.';
    end;
    label1.caption:='AC power status: '+s;

Mattze 13. Sep 2018 07:05

AW: Hat's einen Akku?
 
Hallo,

vielen Dank Euch allen.
Das BatteryFlag gibt es tatsächlich her. Ich hatte das nur übersehen!
Das kann nämlich noch einen Wert annehmen, den man aber nur selten sieht. Meistens nimmt man nur 1, 2, 4, 8 und 255. Es gibt aber noch 128 und mit diesem Wert wird genau das getan, was ich wollte. Wenn das so gesetzt ist, gibt es keine Batterie. Übrigens: Man denkt es, aber "SysPowerStatus.ACLineStatus" macht es offenbar nicht (bei Win10 jedenfalls).

Gruß
Mattze

Codehunter 13. Sep 2018 13:52

AW: Hat's einen Akku?
 
Zitat:

Zitat von Mattze (Beitrag 1413077)
Man denkt es, aber "SysPowerStatus.ACLineStatus" macht es offenbar nicht (bei Win10 jedenfalls).

Das ist ja auch der falsche für deinen Zweck. ACLineStatus gibt an, ob es grad am Netzteil hängt, was AUCH der Fall sein kann wenn es einen Akku hat und IMMER der Fall ist, wenn es keinen hat. Richtig wäre SysPowerStatus.BatteryFlag. Guckst du hier.

Mattze 13. Sep 2018 14:08

AW: Hat's einen Akku?
 
Hallo,

habe ich doch geschrieben!
Trotzdem danke!

Gruß
Mattze

OLDIE1950 13. Sep 2018 16:26

AW: Hat's einen Akku?
 
Das folgende Progrämmchen zeigt den Status in der Titelzeile an:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

const
 GUID_ACDC_POWER_SOURCE: TGUID =
 '{5D3E9A59-E9D5-4B00-A6BD-FF34FF516548}';
 PBT_POWERSETTINGCHANGE = 32787;

type
  PPowerbroadcastSetting = ^TPowerbroadcastSetting;
  POWERBROADCAST_SETTING = packed record
    PowerSetting: TGUID;
    DataLength: DWord;
    Data: array[0..0] of Char;
  end;
  {$EXTERNALSYM POWERBROADCAST_SETTING}
  TPowerbroadcastSetting = POWERBROADCAST_SETTING;

type
  TForm1 = class(TForm)
    procedure PowerMessage(var msg: TMessage); message
    WM_POWERBROADCAST;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

function RegisterPowerSettingNotification(hRecipient: THandle;
         PowerSettingGuid: PGUID; Flags: DWORD): THandle; stdcall;
external 'user32.dll';
function UnregisterPowerSettingNotification(Handle: THandle): BOOL; stdcall;
external 'user32.dll';

var
  Form1: TForm1;
  psn: THandle;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  psn := RegisterPowerSettingNotification(Form1.Handle,
  @GUID_ACDC_POWER_SOURCE , 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   UnregisterPowerSettingNotification(psn);
end;

procedure TForm1.PowerMessage(var msg: TMessage);
var pb_setting: TPowerbroadcastSetting;
    buf: DWord;
begin
  if msg.WParam = PBT_POWERSETTINGCHANGE then
  begin
    pb_setting := PPowerbroadcastSetting(msg.LParam)^;
    if GUIDToString(pb_setting.PowerSetting) = GUIDToString(GUID_ACDC_POWER_SOURCE) then
    begin
      buf := 0;
      move(pb_setting.Data, buf, SizeOf(DWord));
      case buf of
        0: Caption:= 'Netzbetrieb';
        1: Caption:= 'Akkubetrieb';
        2: Caption:= 'USV-Betrieb';
      end;
    end;

  end;
end;

end.

himitsu 13. Sep 2018 18:31

AW: Hat's einen Akku?
 
Weil jemand das mit den "Werten" falsch versteht?

Es sind keine Werte, sondern Bits und Bit-Masken.

Bit 7 = keine Batterie
außer bei Bits 0-7 alle gesetzt = ungekannt

Bits 3 und 4 (also Wert 12) = Critical + Charging


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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