Programmierung > Delphi > Batterie > Eigenschaften setzen

Eigenschaften der Batterie setzen

  • Beschreibung
  • Control Code IOCTL_BATTERY_SET_INFORMATION
  • Struktur BATTERY_SET_INFORMATION
  • Funktion in Delphi 7
  • Download
  • Links
  • Beschreibung

    Dies funktioniert nur, wenn der Controlcode unterstützt wird. Dies ist bei meinem Laptop leider nicht der Fall, so dass ich die Funktionalität nicht überprüfen kann.

    Der Name IOCTL_BATTERY_SET_INFORMATION des Controlcodes lässt vermuten, dass mit ihm Informationen gesetzt bzw. verändert werden können. Dem ist jedoch nicht so. Es lässt sich lediglich der BIAS, die Sicherheitsreserve, setzen. Ausserdem kann man die Batterie manuell ent- und aufladen.

    Die Operationen wurden bei mir ohne Fehlermeldung ausgeführt, jedoch scheinen sie nicht unterstütztzu werden.

    Control Code IOCTL_BATTERY_SET_INFORMATION

    Die c++-Definition im NSDN Windows Dev Center:

    BOOL DeviceIoControl(
      (HANDLE) hDevice,              // handle to battery
      IOCTL_BATTERY_SET_INFORMATION, // dwIoControlCode
      (LPVOID) lpInBuffer,           // input buffer
      (DWORD) nInBufferSize,         // size of input buffer
      NULL,                          // lpOutBuffer
      0,                             // nOutBufferSize
      (LPDWORD) lpBytesReturned,     // number of bytes returned
      (LPOVERLAPPED) lpOverlapped    // OVERLAPPED structure
    );
    

    hDevice: Das Handle, welches im Kapitel Handle ermittelt wurde.

    dwIoControlCode: Der Controlcode für die Operation.

    lpInBuffer: Ein Zeiger auf den Speicher mit einer Datenstuktur BATTERY_SET_INFORMATION, mit welcher mitgeteilt wird, welche Information wie gesetzt werden.

    nInBufferSize: Die Größe der Datenstruktur in Byte.

    lpOutBuffer: Einen Rückgabepuffer gibt es bei dieser Operation nicht.

    nOutBufferSize: Die Größe des Rückgabepuffers ist 0.

    lpBytesReturned: Ein Zeiger auf einen Wert, der angibt, wieviel Daten zurückgegben wurden. Da kein Rückgabepuffer verwendet wird, sollte der Wert 0 sein, ausser es wird eine Overlapped Struktur verwendet.

    lpOverlapped: Ein Zeiger auf die Overlapped Struktur. Sie kann nur vorhanden sein, wenn das Gerät mit dem Flag FILE_FLAG_OVERLAPPED geöffnet wurde. Dies ist hier nicht der Fall.

    Wurde die Operation fehlerfrei durchgeführt ist der Rückgabewert ungleich 0.

    Die Funktion ist in Delphi in der Unit Windows deklariert.

    Der Controlcode IOCTL_BATTERY_SET_INFORMATION ist in der batclass.h definiert:

    #define FILE_DEVICE_BATTERY   0x00000029
     
    #define IOCTL_BATTERY_SET_INFORMATION \
        CTL_CODE(FILE_DEVICE_BATTERY, 0x12, METHOD_BUFFERED, FILE_WRITE_ACCESS)
    
    const
      FILE_DEVICE_BATTERY = $00000029;
      FILE_READ_ACCESS    = $0001;
      METHOD_BUFFERED     = $0000;
    
    const
      IOCTL_BATTERY_SET_INFORMATION = (FILE_DEVICE_BATTERY shl 16 or
                                       FILE_READ_ACCESS shl 14 or
                                       $12 shl 2 or
                                       METHOD_BUFFERED);
    

    Struktur BATTERY_SET_INFORMATION

    Die Struktur enthält die zu setzenden Batterieinformationen und die c++-Definition im NSDN Windows Dev Center lautet:

    typedef struct _BATTERY_SET_INFORMATION {
      ULONG                         BatteryTag;
      BATTERY_SET_INFORMATION_LEVEL InformationLevel;
      UCHAR                         Buffer[1];
    } BATTERY_SET_INFORMATION, *PBATTERY_SET_INFORMATION;
    

    BatteryTag: Der aktuelle Batterie-Tag für die Batterie, welcher im Kapitel Tag ermittelt wurde. Wenn dieser Wert nicht mit dem aktuellen Tag der Batterie übereinstimmt, wird die Anfrage mit ERROR_FILE_NOT_FOUND abgeschlossen.

    InformationLevel: Gibt an, welche Information gewünscht wird.

    Informationslevel Wert Beschreibung
    BatteryCharge 1 Informiert das Batteriegerät darüber, dass die Batterie aufgeladen werden soll.
    BatteryCriticalBias 0 Stellt die kritische Restladung der Batterie ein. Dies ist nur nur als Wartungsfunktion und nicht in allen Batterien vorhanden, deshalb sollte kontrolliert werden, dass die Batterie die Einstellung akzeptiert hat.
    BatteryDischarge 2 Informiert das Batteriegerät darüber, dass die Batterie entladen werden soll.

    Buffer: Der Buffer wird nur für das Informationslevel BatteryCriticalBias benötigt.

    Die Deklaration in Delphi:

    type
      BATTERY_SET_INFORMATION_LEVEL =
      (
        BatteryCriticalBias,
        BatteryCharge,
        BatteryDischarge
      );
      TBATTERY_SET_INFORMATION_LEVEL = BATTERY_SET_INFORMATION_LEVEL;
     
    type
      _BATTERY_SET_INFORMATION =
      record
        BatteryTag       : ULONG;
        InformationLevel : BATTERY_SET_INFORMATION_LEVEL;
        Buffer           : Array [0..0] of UCHAR;
      end;
      TBATTERY_SET_INFORMATION = _BATTERY_SET_INFORMATION;
      PBATTERY_SET_INFORMATION = ^_BATTERY_SET_INFORMATION;
    

    Funktion in Delphi 7

    Ob die Funktionen funktionieren oder nicht, kann ich leider nicht überprüfen. Der Control Code wird von meinem Laptop nicht unterstützt.

    function SetBatteryBias(hBattery: THandle; aTag: Cardinal;
                            const aBias: ULONG): Boolean;
    var
      rBatSetInfo : TBATTERY_SET_INFORMATION;
      dwReturned  : Cardinal;
      dwResult    : LongBool;
    begin
      Result := False;
     
      ZeroMemory(@rBatSetInfo, SizeOf(TBATTERY_SET_INFORMATION));
      rBatSetInfo.BatteryTag       := aTag;
      rBatSetInfo.InformationLevel := BatteryCriticalBias;
      rBatSetInfo.Buffer           := aBias;
     
      dwReturned := 0;
     
      dwResult := DeviceIoControl(hBattery,
                                  IOCTL_BATTERY_SET_INFORMATION,
                                  @rBatSetInfo,
                                  SizeOf(TBATTERY_SET_INFORMATION),
                                  nil,
                                  0,
                                  dwReturned,
                                  nil);
     
      Result := dwresult and (GetLastError = 0);
    end;
    
    function SetBatteryChargeDischarge(hBattery: THandle; aTag: Cardinal;
                                      const bCharge: Boolean): Boolean;
    var
      rBatSetInfo : TBATTERY_SET_INFORMATION;
      dwReturned  : Cardinal;
      dwResult    : LongBool;
    begin
      Result := False;
     
      ZeroMemory(@rBatSetInfo, SizeOf(TBATTERY_SET_INFORMATION));
      rBatSetInfo.BatteryTag       := aTag;
      if (bCharge)
      then rBatSetInfo.InformationLevel := BatteryCharge
      else rBatSetInfo.InformationLevel := BatteryDischarge;
     
      dwReturned := 0;
     
      dwResult := DeviceIoControl(hBattery,
                                  IOCTL_BATTERY_SET_INFORMATION,
                                  @rBatSetInfo,
                                  SizeOf(TBATTERY_SET_INFORMATION),
                                  nil,
                                  0,
                                  dwReturned,
                                  nil);
     
      Result := dwresult and (GetLastError = 0);
    end;
    

    Download

    Demo mit Delphi 7 compiliert
    battery_set_exe.7z (163 kB) - MD5 (1kB)

    Source der Demo
    battery_set_src.7z (6 kB) - MD5 (1kB)