Proč mínusujete? To mi nevěříte?
Tady je kousek kódu na zobrazení stavu baterie v liště. VOID
PASCAL
Power_UpdateStatus(
HWND hWnd,
DWORD NotifyIconMessage,
BOOL bForceUpdate
)
{
UINT NewIconID;
HICON hIcon;
LPTSTR pStr;
LPTSTR pBatteryLevelStr;
UINT BatteryLevelStringID=0;
UINT Counter;
DWORD BatteryLifeTime;
UINT Percent;
DWORD Hours;
DWORD Minutes;
BOOL fNewTip;
SYSTEM_POWER_STATUS SystemPowerStatus; static UINT TrayIconID = 0; // ID of current tray icon
static HICON hTrayIcon = NULL; static LPTSTR pLevelStr = NULL; // Battery level string
static LPTSTR pRemainStr = NULL; // Battery remaining life string static UINT PowerSourceIconID = 0; // ID of current dialog icon
static HICON PowerSourceIcon = NULL; static SYSTEM_POWER_STATUS LastPowerStatus;
static const struct {
BYTE nLowPercent; // if (% >= low &&
BYTE nHighPercent; // % = 66)
SystemPowerStatus.BatteryFlag = BATTERY_FLAG_HIGH;
else if (SystemPowerStatus.BatteryLifePercent >= 33)
SystemPowerStatus.BatteryFlag = BATTERY_FLAG_LOW;
else
SystemPowerStatus.BatteryFlag = BATTERY_FLAG_CRITICAL;
} // If we don't know the battery percentage, map the battery flag to an
// approximate percentage. else
if (SystemPowerStatus.BatteryLifePercent == BATTERY_PERCENTAGE_UNKNOWN &&
SystemPowerStatus.BatteryFlag != BATTERY_FLAG_UNKNOWN)
{
if (SystemPowerStatus.BatteryFlag & BATTERY_FLAG_HIGH)
SystemPowerStatus.BatteryLifePercent = 100;
else if (SystemPowerStatus.BatteryFlag & BATTERY_FLAG_LOW)
SystemPowerStatus.BatteryLifePercent = 33;
else if (SystemPowerStatus.BatteryFlag & BATTERY_FLAG_CRITICAL)
SystemPowerStatus.BatteryLifePercent = 10;
} // Display the amount of time remaining preferably in the number of hours,
// otherwise as a percentage. Last resort is to say we just don't know! if (((g_dwBatFlags & BATFLAGS_SHOWPERCENT) == 0) &&
SystemPowerStatus.BatteryLifeTime != BATTERY_LIFE_UNKNOWN)
{
BatteryLifeTime = (UINT) (SystemPowerStatus.BatteryLifeTime / 60); Hours = BatteryLifeTime / 60;
Minutes = BatteryLifeTime % 60; if (Hours > 0)
pStr = LoadDynamicString(IDS_TIMEREMAININGFORMAT, Hours, Minutes / 6);
else
pStr = LoadDynamicString(IDS_SMTIMEREMAININGFORMAT, Minutes);
}
else if (SystemPowerStatus.BatteryLifePercent = BatPolicy[i].nLowPercent &&
SystemPowerStatus.BatteryLifePercent <= BatPolicy[i].nHighPercent &&
(SystemPowerStatus.BatteryFlag & BatPolicy[i].wBatFlags))
{
NewIconID = BatPolicy[i].nIconID;
if (BatPolicy[i].nStrID != 0)
BatteryLevelStringID = BatPolicy[i].nStrID;
break;
}
} // Pick the Battery level string to display in the dialog box if (BatteryLevelStringID != IDS_UNKNOWN)
{
BatteryLevelStringID = IDS_UNKNOWN; if (SystemPowerStatus.BatteryFlag != BATTERY_FLAG_UNKNOWN)
{
if (SystemPowerStatus.BatteryFlag & BATTERY_FLAG_NO_BATTERY)
BatteryLevelStringID = IDS_NO_BATTERY;
else
for (Counter = BATTERY_STATUS_HIGH; Counter <=
BATTERY_STATUS_CHARGING; Counter++)
if (SystemPowerStatus.BatteryFlag & (1 << Counter))
{
BatteryLevelStringID = IDS_HIGH + Counter;
break;
}
}
} // If AC is on-line, display either Charging or AC On-Line if (SystemPowerStatus.ACLineStatus == AC_LINE_ONLINE &&
BatteryLevelStringID != IDS_CHARGING) pStr = LoadDynamicString(IDS_ACLINEONLINE); else
{
pStr = pBatteryLevelStr = LoadDynamicString(BatteryLevelStringID);
if (BatteryLevelStringID != IDS_NO_BATTERY)
{
pStr = LoadDynamicString(IDS_BATTERYLEVELFORMAT,(LPTSTR)pBatteryLevelStr);
DeleteDynamicString(pBatteryLevelStr);
}
} // Update the battery level text if changed if (pLevelStr == NULL || lstrcmp(pLevelStr, pStr) != 0)
{
if (pLevelStr != NULL)
DeleteDynamicString(pLevelStr);
SetDlgItemText(hWnd, IDC_BATTERYLEVEL, pStr);
pLevelStr = pStr;
}
else
DeleteDynamicString(pStr); // Update the tray if the icon or tip msg has changed if (TrayIconID != NewIconID || fNewTip)
{
hIcon = (TrayIconID != NewIconID) ?
LoadImage(g_hInstance, MAKEINTRESOURCE(NewIconID),
IMAGE_ICON, 16, 16, 0) : hTrayIcon; SysTray_NotifyIcon(hWnd, STWM_NOTIFYPOWER, NotifyIconMessage,
hIcon, pRemainStr); if (hTrayIcon != NULL && hTrayIcon != hIcon)
DestroyIcon(hTrayIcon); TrayIconID = NewIconID;
hTrayIcon = hIcon;
} // Pick the icon to display in the dialog box if (SystemPowerStatus.ACLineStatus == AC_LINE_ONLINE ||
BatteryLevelStringID == IDS_CHARGING)
NewIconID = IDI_ACPOWER; if (PowerSourceIconID != NewIconID)
{
hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(NewIconID)); SendDlgItemMessage(hWnd, IDC_POWERSTATUSICON, STM_SETICON, (WPARAM) hIcon, 0); if (PowerSourceIcon)
DestroyIcon(PowerSourceIcon); PowerSourceIconID = NewIconID;
PowerSourceIcon = hIcon;
} // Update the power status bar which graphically displays the battery
// percentage. if (SystemPowerStatus.BatteryLifePercent <= 100)
Percent = SystemPowerStatus.BatteryLifePercent;
else
Percent = 0; SendDlgItemMessage(hWnd, IDC_POWERSTATUSBAR, PBM_SETPOS, (WPARAM) Percent, 0); // If the user wants low battery warnings, show the warning msg box if the
// battery level just went low. if ((g_dwBatFlags & BATFLAGS_LOWBATWARN) &&
SystemPowerStatus.BatteryFlag != BATTERY_FLAG_UNKNOWN &&
SystemPowerStatus.ACLineStatus != AC_LINE_ONLINE)
{
// low is (flag_critical && % <= 50) or (flag_low && % <= 10)
if ((SystemPowerStatus.BatteryFlag & BATTERY_FLAG_LOW &&
SystemPowerStatus.BatteryLifePercent <= 10) ||
(SystemPowerStatus.BatteryFlag & BATTERY_FLAG_CRITICAL &&
SystemPowerStatus.BatteryLifePercent <= 50))
{
if (!g_bGaveWarning && !g_bShowingWarning)
// only do this once per transition to low
{
MSGBOXPARAMS MsgBoxParams; g_bGaveWarning = TRUE; MsgBoxParams.cbSize = sizeof(MSGBOXPARAMS);
MsgBoxParams.hwndOwner = NULL;
MsgBoxParams.hInstance = g_hInstance;
MsgBoxParams.lpszText = MAKEINTRESOURCE(IDS_LOWBAT_MSG);
MsgBoxParams.lpszCaption = MAKEINTRESOURCE(IDS_LOWBAT_TITLE);
MsgBoxParams.dwStyle = MB_OK | MB_SETFOREGROUND | MB_USERICON;
MsgBoxParams.lpszIcon = MAKEINTRESOURCE(IDI_ALMOSTDEADBATTERY);
MsgBoxParams.dwContextHelpId = 0;
MsgBoxParams.lpfnMsgBoxCallback = 0;
MsgBoxParams.dwLanguageId = 0; g_bShowingWarning = TRUE;
MessageBoxIndirect(&MsgBoxParams);
g_bShowingWarning = FALSE;
}
}
else
g_bGaveWarning = FALSE; // reset if battery is no longer low
}
else
g_bGaveWarning = FALSE; // reset if we transition AC line states
}