C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как узнать уровень заряда батареи ноутбука?
** Human
  Отправлено: 03.01.2006, 13:50


Не зарегистрирован







имеется в виду функция конечно biggrin.gif а не где в виндосе посмотреть biggrin.gif
ведь независимо от типа батареи и ноутбука виндовс узнает процент заряда батареи.
так же хотелось бы выяснить как узнать параметры батареи: производителя, емкость и т.д.
** Human
  Отправлено: 03.01.2006, 15:12


Не зарегистрирован







нашел пример кода на дельфи

procedure TForm1.Button1Click(Sender: TObject);
var
SysPowerStatus: TSystemPowerStatus;
begin
GetSystemPowerStatus(SysPowerStatus);
if Boolean(SysPowerStatus.ACLineStatus) then
begin
ShowMessage('System running on AC.');
end
else
begin
ShowMessage('System running on battery.');
ShowMessage(Format('Battery power left: %d percent.', [SysPowerStatus.BatteryLifePercent]));
end;
end;


вот мой код в Cbuilder:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TSystemPowerStatus* SysPowerStatus;
GetSystemPowerStatus(SysPowerStatus);

}

выдает ошибку при вызове функции Access Violation
наверняка я че нить с указателями напутал?
Guest
Отправлено: 03.01.2006, 15:54


Не зарегистрирован







Навскидку, без прокерки.

TSystemPowerStatus SysPowerStatus;
GetSystemPowerStatus(&SysPowerStatus);

** Human
Отправлено: 04.01.2006, 15:23


Не зарегистрирован







QUOTE (Guest @ 03/01/2006, 15:54)
Навскидку, без прокерки.

TSystemPowerStatus SysPowerStatus;
GetSystemPowerStatus(&SysPowerStatus);

БРАВО! БИС! biggrin.gif
работает
вельми понеже
как плохо быть тупым sad.gif
** Human
Отправлено: 09.02.2006, 12:38


Не зарегистрирован







остался вопрос по поводу характеристик батареи: производителя, емкости и других...
нашел некий код для дельфи с использованием функции win32check
насколько я понял, там получается handle батареи и выцарапываются ее характеристики как устройства...
вот код:

function GetBatteryDeviceHandles(var hBattDevices:array of THandle):Integer;
var
hBattClassInfo:HDEVINFO;
lpInterfaceDetailData:PSPDeviceInterfaceDetailData;
spInterfaceData:TSPDeviceInterfaceData;
dwInterfaceDetailDataSize:DWORD;
dwErrCode,dwReqSize:DWORD;
bStatus:Boolean;
begin
LoadSetupApi;
bStatus:=True;
lpInterfaceDetailData:=nil;
// get the device class handle for the battery ports in the system
hBattClassInfo:=SetupDiGetClassDevs(@GUID_DEVICE_BATTERY,nil,0,DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
Win32Check(hBattClassInfo<>HDEVINFO(INVALID_HANDLE_VALUE));
// with the device class handle, we can now enumerate the paths to the battery ports
Result:=0;
spInterfaceData.cbSize:=SizeOf(spInterfaceData);
while SetupDiEnumDeviceInterfaces(hBattClassInfo,nil,GUID_DEVICE_BATTERY,Result,spInterfaceData) do begin
// Now we have the interface data for the current battery port
// To obtain its path, we have to make two calls into SetupDiGetDeviceInterfaceDetail. The first call
// determines the buffer size required to hold the interface detail info
bStatus:=SetupDiGetDeviceInterfaceDetail(
hBattClassInfo,// Interface Device info handle
@spInterfaceData,// Interface data for the event class
nil,// Checking for buffer size
0,// Checking for buffer size
dwReqSize,// Buffer size required to get the detail data
nil// Checking for buffer size
);

// If this call returns ERROR_INSUFFICIENT_BUFFER, dwReqSize will be set to the required buffer size. Otherwise there is a problem.
// if the call succeeded with a NULL buffer, there is some other problem
if bStatus or(GetLastError<>ERROR_INSUFFICIENT_BUFFER) then
RaiseLastOSError;
// Allocate memory to get the interface detail data, which will contain the path to the battery port device
dwInterfaceDetailDataSize:=dwReqSize;
lpInterfaceDetailData:=AllocMem(dwInterfaceDetailDataSize);
try
lpInterfaceDetailData.cbSize:=SizeOf(TSPDeviceInterfaceDetailData);
bStatus:=SetupDiGetDeviceInterfaceDetail(
hBattClassInfo,// Interface Device info handle
@spInterfaceData,// Interface data for the event class
lpInterfaceDetailData,// Interface detail data
dwInterfaceDetailDataSize,// Interface detail data size
dwReqSize,// Buffer size required to get the detail data
nil);// Interface device info
Win32Check(bStatus);
// Now let's attempt to open the battery device
hBattDevices[Result]:=CreateFile(
lpInterfaceDetailData.DevicePath,// device interface name
GENERIC_READ or GENERIC_WRITE,// dwDesiredAccess
FILE_SHARE_READ or FILE_SHARE_WRITE,// dwShareMode
nil,// lpSecurityAttributes
OPEN_EXISTING,// dwCreationDistribution
0,// dwFlagsAndAttributes
0// hTemplateFile
);
Win32Check(hBattDevices[Result]<>INVALID_HANDLE_VALUE);
finally
// we're done with the buffer, so free it
FreeMem(lpInterfaceDetailData);
end;
Inc(Result);
end;// END FOR
// the only correct way we exit the while loop is if SetupDiEnumDeviceInterfaces returns ERROR_NO_MORE_ITEMS
Win32Check(GetLastError=ERROR_NO_MORE_ITEMS);
end;

procedure GetBatteryStatus(hDevice:THandle;var pbs:TBatteryStatus;var pbi:TBatteryInformation);
var
dwByteCount,dwWait:DWORD;
bws:TBatteryWaitStatus;
bqi:TBatteryQueryInformation;
begin
Win32Check(hDevice<>INVALID_HANDLE_VALUE);
dwByteCount:=0;
dwWait:=0;
bws.BatteryTag:=0;
Win32Check(DeviceIoControl(hDevice,IOCTL_BATTERY_QUERY_TAG,
@dwWait,SizeOf(dwWait),
@bws.BatteryTag,SizeOf(bws.BatteryTag),
dwByteCount,nil));
dwByteCount:=0;
bqi.BatteryTag:=bws.BatteryTag;
bqi.InformationLevel:=BatteryInformation;
Win32Check(DeviceIoControl(
hDevice,
IOCTL_BATTERY_QUERY_INFORMATION,
@bqi,SizeOf(TBatteryQueryInformation),
@pbi,SizeOf(TBatteryInformation),
dwByteCount,nil));
Win32Check(DeviceIoControl(
hDevice,
IOCTL_BATTERY_QUERY_STATUS,
@bws,SizeOf(TBatteryWaitStatus),
@pbs,SizeOf(TBatteryStatus),
dwByteCount,nil));
end;


можно его как то вставить в билдер? или надо все переделывать?

Вернуться в Вопросы программирования в C++Builder