NT系OSで電源状態を取得するには

解決


Kenny  2010-01-14 23:16:47  No: 36989

PCの電源状態を取得するためのAPIとしてGetSystemPowerStatus()が定義されていますが、リファレンスでは
WindowsNTは不可となっています。
実際に自分のXP-Pro+Delphi7で簡単なサンプルを作って動かしたところ、BatteryFullLifeTimeパラメータ
以外は正常に取得できているようですが、正式には「不可」とされていますし、何か新しい関数が定義
されているのでしょうか。


jazzin  2010-01-15 01:33:57  No: 36990

どのリファレンスを見て不可と判断されたのかは分かりませんが、
GetSystemPowerStatusはNTでは存在自体せず、2000以降で実装されたAPIです。
なので、もちろんXPにも存在しますし動作もします。

どうも「WindowsNT」と「NT系」を混同されているようですが、
NTで使用不可だからといってNT系全部不可というわけではありません。
2000もXPも「NT系」ではありますが、APIなどは別物だと考えた方が良いと思います。
2000以降にしかないAPI、XP以降にしかないAPI、Vista以降にしか…というのはたくさんありますし。

OSバージョンなども含め、Win32APIの詳細はMSDNを参考にされるのが一番確実です。
GetSystemPowerStatus 関数 http://msdn.microsoft.com/ja-jp/library/cc429168.aspx

// たまにMSDNでも堂々と間違ってたりしますが^^;
// 一番正確な情報が載ってるのはMSDNの英語版ですね


Kenny  2010-01-15 02:29:12  No: 36991

jazzinさん、コメントありがとうございます。
リファレンスはDelphi7付属のWin32ヘルプを見ていたのですが、おっしゃるようにNTとNT系を混同していました。
で、実験しながらMSDNをさまよって、

対応情報
Windows NT/2000:Windows 2000 を使います。
Windows 95/98:Windows 95 以降を使います。
Windows CE:対応していません。
というのを見つけたところでした。NTとCEだけが不可のようですね。

ただ、BatteryFlagパラメーターが
http://msdn.microsoft.com/en-us/library/ms704147(VS.85).aspx  では
public enum BatteryFlag : byte
  High        = 1,
  Low         = 2,
  Critical    = 4,
  Charging    = 8,
  NoSystemBattery = 128,
  Unknown     = 255

と定義されていて、他のリファレンスも全てそうなっているのですが、実験では
  Highと思われる  1,
  Low と思われる  0,
  Critical と思われる  2,
  Charging と思われる  10,
  NoSystemBattery = 128(バッテリーを取り外して確認),
  Unknown     = 未確認
が帰ってきて、それでまた悩んでいるところです。


tor  2010-01-15 02:41:11  No: 36992

これはビットフラグの組み合わせで表されますから
> Charging と思われる  10
というのは実際には2+8、すなわちLow+Chargingの状態を表します。
0だとどれも立っていないので、おそらくHighとLowの中間ということなのでしょう。

それぞれの状態を個別に判定するにはビットAnd演算子を使って、例えば
if (BatteryFlag And 8) <> 0 then // Chargingだよ
のようにします。
(Unknown=255だとすべてのビットが立ってしまうので、これだけ個別に判定する必要がありそうですけど)


Kenny  2010-01-15 03:11:25  No: 36993

torさん、コメントありがとうございます。
ビットフラグの組み合わせ、というのは少し考えたのですが、それよりも定義されていない「0」に
目が行ってしまいました。挙動を見ていると、先ほどの私の観察は間違っていて、正しくは
Highと思われる「1」,
Low と思われる「2」,
Critical は表示される前に、バッテリーアラームと共にスタンバイに移行するので,「4」は表示できない
ということのようですね。High+Chargingなど、他の挙動も確認したいと思います。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加