《電子技術應用》
您所在的位置:首頁 > 電源技術 > 設計應用 > Windows CE 電源管理
Windows CE 電源管理
摘要: WindowsCE是典型的使用電池供電的系統。這使得正確操作系統十分關鍵,應用程序大多數時間都不需要關注WindowsCE設備的電源損耗,但是在某些時候,你可能要注意這些損耗。
Abstract:
Key words :

  Windows CE" title="Windows CE">Windows CE是典型的使用電池供電的系統。這使得正確操作系統十分關鍵,應用程序大多數時間都不需要關注Windows CE 設備的電源損耗,但是在某些時候,你可能要注意這些損耗。

  當用戶關閉了一個使用電池的Windows CE 設備,電源系統不會關閉PC電源,事實上,只是系統被掛起(譯者注:這里就像有些PocketPC把關閉電源放在拔SIM卡的位置,拔出SIM卡才真正關閉電源。但是,目前包括Smartphone在內,因為硬件設備,比如CPU無法進入低功耗,所以為了省電,需要做到關閉應用處理器及大部分設備供電,然后需要喚醒時,再通過定時器或無線模塊喚醒。所以不關閉電源的情況不是絕對的。)當用戶打開設備電源,設備不會像PC一樣重新啟動,而是被喚醒,返回到與系統掛起前一樣的狀態。這樣導致一個應用程序在喚醒后會像掛起前一樣運行。事實上,應用程序根本不知道它被掛起,除非它明確地請求當系統掛起時通知它。從應用程序的角度看,電源管理" title="電源管理">電源管理有三種方式,查詢電源狀態,改變電源狀態,和防止電源狀態改變。

  查詢電源狀態

  要查詢系統當前的電源狀態,你必須調用

  DWORD GetSystemPowerStatusEx2 (PSYSTEM_POWER_STATUS_EX2 pSystemPowerStatusEx2, DWORD dwLen, BOOL fUpdate);

  函數帶了三個參數:一個指向SYSTEM_POWER_ STATUS_EX2結構的指針,結構的長度,和一個布爾值,表示告訴操作系統是否應該查詢電池驅動來得到最后的信息或者直接返回電池緩存中的信息。系統大約每5秒查詢一次電池狀態,因此,如果第三個差數是FALSE,得到的數據不會太舊。結構SYSTEM_POWER_STATUS_EX2被定義為

  typedef struct _SYSTEM_POWER_STATUS_EX2 {

  BYTE ACLineStatus;

  BYTE BatteryFlag;

  BYTE BatteryLifePercent;

  BYTE Reserved1;

  DWORD BatteryLifeTime;

  DWORD BatteryFullLifeTime;

  BYTE Reserved2;

  BYTE BackupBatteryFlag;

  BYTE BackupBatteryLifePercent;

  BYTE Reserved3;

  DWORD BackupBatteryLifeTime;

  DWORD BackupBatteryFullLifeTime;

  WORD BatteryVoltage;

  DWORD BatteryCurrent;

  DWORD BatteryAverageCurrent;

  DWORD BatteryAverageInterval;

  DWORD BatterymAHourConsumed;

  DWORD BatteryTemperature;

  DWORD BackupBatteryVoltage;

  BYTE BatteryChemistry;

  } SYSTEM_POWER_STATUS_EX2;

  在我描述的這個巨大的結構之前,我必須告誡你,這個結構返回的數據精確程度和電池驅動一樣。同樣的結構被傳給電池驅動來查詢它的狀態。Windows CE不驗證電池驅動返回的數據。這個函數返回來的數據依賴于電池驅動,因此不同的系統有不同的變化。舉個例子,許多系統在使用AC電源時不報告精確的電源級數;另一些系統則相反。應用程序使用GetSystemPowerStatusEx2來自動預防和檢測系統是否可能運行應用程序。

  第一個區域,ACLineStatus,包含一個標志,表示系統是否連接到AC 電源。如果值是AC_LINE_OFFLINE,表示系統沒有使用AC 電源;AC_LINE_ONLINE,表示系統使用了AC 電源;AC_LINE_BACKUP_POWER和AC_LINE_UNKNOWN,表示備用電源和未知電源。BatteryFlag區域,提供了一個總的標識,表示當前系統的電池狀態,可以有以下值:

  BATTERY_FLAG_HIGH

  電池被充滿或接近充滿。

  BATTERY_FLAG_LOW

  電池還有一點剩余。

  BATTERY_FLAG_CRITICAL

  電池電量處在一個臨界狀態。

  BATTERY_FLAG_CHARGING

  電池當前正在充電。

  BATTERY_FLAG_NO_BATTERY

  系統無電池

  BATTERY_FLAG_UNKNOWN

  電池狀態未知

  BatteryLifePercent區域包含估計的電池電量能夠維持的百分比。數值可能是0到100之間的一個,或用255表示百分比未知。BatteryLifeTime區域表示電池耗盡之前可以維持的秒數。如果該值不能估計,區域填入BATTERY_LIFE_UNKNOWN。BatteryFullLifeTime區域包含完全充滿電池需要的時間。如果該值不能估計,填入BATTERY_LIFE_UNKNOWN。注意,在許多系統中,這些值可能難以測量。大多數OEM 廠商簡單地在每個區域內填入BATTERY_LIFE_UNKNOWN。

  接下來的第四個區域(不計算保留區域)重復了前面的表述,只不過是對系統備份電池來說。因為這些值大多數難以測量,許多系統簡單地返回“unknown”給這些區域。

  剩下的區域描述了電池和備用電池的電力狀態,因為許多系統缺少測量這些值的能力,這些區域也被簡單地默認為“unknown”。最后一個區域,BatteryChemistry,包含一個標志,表示系統中電池的類型。當前已定義的值包括

  BATTERY_CHEMISTRY_ALKALINE

  BATTERY_CHEMISTRY_NICD

  BATTERY_CHEMISTRY_NIMH

  BATTERY_CHEMISTRY_LION

  BATTERY_CHEMISTRY_LIPOLY

  BATTERY_CHEMISTRY_UNKNOWN

  Windows CE是典型的使用電池供電的系統。這使得正確操作系統十分關鍵,應用程序大多數時間都不需要關注Windows CE 設備的電源損耗,但是在某些時候,你可能要注意這些損耗。

  當用戶關閉了一個使用電池的Windows CE 設備,電源系統不會關閉PC電源,事實上,只是系統被掛起(譯者注:這里就像有些PocketPC把關閉電源放在拔SIM卡的位置,拔出SIM卡才真正關閉電源。但是,目前包括Smartphone在內,因為硬件設備,比如CPU無法進入低功耗,所以為了省電,需要做到關閉應用處理器及大部分設備供電,然后需要喚醒時,再通過定時器或無線模塊喚醒。所以不關閉電源的情況不是絕對的。)當用戶打開設備電源,設備不會像PC一樣重新啟動,而是被喚醒,返回到與系統掛起前一樣的狀態。這樣導致一個應用程序在喚醒后會像掛起前一樣運行。事實上,應用程序根本不知道它被掛起,除非它明確地請求當系統掛起時通知它。從應用程序的角度看,電源管理有三種方式,查詢電源狀態,改變電源狀態,和防止電源狀態改變。

  查詢電源狀態

  要查詢系統當前的電源狀態,你必須調用

  DWORD GetSystemPowerStatusEx2 (PSYSTEM_POWER_STATUS_EX2 pSystemPowerStatusEx2, DWORD dwLen, BOOL fUpdate);

  函數帶了三個參數:一個指向SYSTEM_POWER_ STATUS_EX2結構的指針,結構的長度,和一個布爾值,表示告訴操作系統是否應該查詢電池驅動來得到最后的信息或者直接返回電池緩存中的信息。系統大約每5秒查詢一次電池狀態,因此,如果第三個差數是FALSE,得到的數據不會太舊。結構SYSTEM_POWER_STATUS_EX2被定義為

  typedef struct _SYSTEM_POWER_STATUS_EX2 {

  BYTE ACLineStatus;

  BYTE BatteryFlag;

  BYTE BatteryLifePercent;

  BYTE Reserved1;

  DWORD BatteryLifeTime;

  DWORD BatteryFullLifeTime;

  BYTE Reserved2;

  BYTE BackupBatteryFlag;

  BYTE BackupBatteryLifePercent;

  BYTE Reserved3;

  DWORD BackupBatteryLifeTime;

  DWORD BackupBatteryFullLifeTime;

  WORD BatteryVoltage;

  DWORD BatteryCurrent;

  DWORD BatteryAverageCurrent;

  DWORD BatteryAverageInterval;

  DWORD BatterymAHourConsumed;

  DWORD BatteryTemperature;

  DWORD BackupBatteryVoltage;

  BYTE BatteryChemistry;

  } SYSTEM_POWER_STATUS_EX2;

  在我描述的這個巨大的結構之前,我必須告誡你,這個結構返回的數據精確程度和電池驅動一樣。同樣的結構被傳給電池驅動來查詢它的狀態。Windows CE不驗證電池驅動返回的數據。這個函數返回來的數據依賴于電池驅動,因此不同的系統有不同的變化。舉個例子,許多系統在使用AC電源時不報告精確的電源級數;另一些系統則相反。應用程序使用GetSystemPowerStatusEx2來自動預防和檢測系統是否可能運行應用程序。

  第一個區域,ACLineStatus,包含一個標志,表示系統是否連接到AC 電源。如果值是AC_LINE_OFFLINE,表示系統沒有使用AC 電源;AC_LINE_ONLINE,表示系統使用了AC 電源;AC_LINE_BACKUP_POWER和AC_LINE_UNKNOWN,表示備用電源和未知電源。BatteryFlag區域,提供了一個總的標識,表示當前系統的電池狀態,可以有以下值:

  BATTERY_FLAG_HIGH

  電池被充滿或接近充滿。

  BATTERY_FLAG_LOW

  電池還有一點剩余。

  BATTERY_FLAG_CRITICAL

  電池電量處在一個臨界狀態。

  BATTERY_FLAG_CHARGING

  電池當前正在充電。

  BATTERY_FLAG_NO_BATTERY

  系統無電池

  BATTERY_FLAG_UNKNOWN

  電池狀態未知

  BatteryLifePercent區域包含估計的電池電量能夠維持的百分比。數值可能是0到100之間的一個,或用255表示百分比未知。BatteryLifeTime區域表示電池耗盡之前可以維持的秒數。如果該值不能估計,區域填入BATTERY_LIFE_UNKNOWN。BatteryFullLifeTime區域包含完全充滿電池需要的時間。如果該值不能估計,填入BATTERY_LIFE_UNKNOWN。注意,在許多系統中,這些值可能難以測量。大多數OEM 廠商簡單地在每個區域內填入BATTERY_LIFE_UNKNOWN。

  接下來的第四個區域(不計算保留區域)重復了前面的表述,只不過是對系統備份電池來說。因為這些值大多數難以測量,許多系統簡單地返回“unknown”給這些區域。

  剩下的區域描述了電池和備用電池的電力狀態,因為許多系統缺少測量這些值的能力,這些區域也被簡單地默認為“unknown”。最后一個區域,BatteryChemistry,包含一個標志,表示系統中電池的類型。當前已定義的值包括

  BATTERY_CHEMISTRY_ALKALINE

  BATTERY_CHEMISTRY_NICD

  BATTERY_CHEMISTRY_NIMH

  BATTERY_CHEMISTRY_LION

  BATTERY_CHEMISTRY_LIPOLY

  BATTERY_CHEMISTRY_UNKNOWN

  改變電源狀態

  應用程序能通過一系列的方式改變系統的電源狀態。在基于Windows CE.NET系統的較新系統中,首選的方式是使用電源管理程序,在之后的章節將會討論。可是無論如何,還有大量的基于早期Windows CE版本的系統以及Windows CE.NET不包含電源管理程序版本。對這些系統來說,下面的技術會很方便。

  關閉電源

  應用程序可以通過調用一個少有資料的GwesPowerOffSystem函數掛起系統。這個函數可以在大多數版本Windows CE中使用,但是最近才被公開。事實上,大多數SDK沒有包含這個函數的原型,你可能要提供原型。這個函數定義為 void GwesPowerOffSystem(void);

  GwesPowerOffSystem的使用很簡單:簡單調用,系統就會掛起。

  如果你想避免使用很少資料的函數,你可以通過簡單地模擬用戶按關閉按鈕來關閉系統。你可以通過使用keybd_event函數很容易地允許你的應用程序掛起系統,如下:

  keybd_event (VK_OFF, 0, KEYEVENTF_SILENT, 0);

  keybd_event (VK_OFF, 0, KEYEVENTF_SILENT │ KEYEVENTF_KEYUP, 0);

  這兩個keybd_event調用模擬了按和釋放電源按鈕,電源按鈕的虛擬鍵值是VK_OFF。執行前面的兩行代碼將掛起系統。因為虛擬鍵代碼在執行時會由GWES表現,兩個函數可能在系統掛起前有一些狀態的表現(譯者注:屏幕上會有關閉對話框之類的圖像,和真實按下按鈕的畫面一樣)。如果你的程序無法在keybd_event函數之前停止工作,添加一個Sleep調用來使應用程序暫停一些毫秒來讓GWES真實地掛起系統。

  關閉系統

  如果系統有有色背光顯示,主要的電源消耗不是CPU而是背光。在一些環境下,一個應用程序需要運行卻不需要顯示在屏幕上。一個例子是音樂播放器應用程序,當用戶聽音樂的時候,不關注屏幕。在這些情形下,有能力關閉背光將意味著提高電池壽命。

  當然,當用戶想看屏幕時,任何關閉背光應用程序的需要一個簡單的用戶友好的方式來重新打開屏幕。同樣,記得用戶典型的想法是屏幕變黑時會認為被關閉了,因此要考慮這點。舉個例子,一個用戶可能在系統已經運行時試圖打開系統電源,并且這樣做了,卻很意外地發現,設備電源被關閉了。同樣,當系統在這種情況下關閉顯示,它同時也關閉了觸摸屏。這意味著你不能告訴用戶敲擊屏幕來打開。而是,你需要使用一些其他的事件,比如設置時間,任務完成,或用戶按了一個按鈕。最后,這里討論的方式對大多數基于Windows CE 3.0或更新的版本比較有用,并且被Windows CE .NET 4.0中的電源管理程序所替代。對于較新的系統,先看看是否電源管理程序可用,然后通過它來控制屏幕。如果失敗了,ExtEscape方式也許能行。

  在Windows CE中,顯示的控制是通過Ext­Escape函數。這是一個顯示和打印機驅動的后門。Windows CE顯示驅動支持許多設備轉義代碼(escape codes),這些被公布在Platform Builder中。對于我們的目的來說,只有兩個轉義代碼被用到:SETPOWERMANAGEMENT來設置顯示的電源狀態和QUERYESCSUPPORT來查詢是否SETPOWERMANAGEMENT被驅動支持。下面的例子打開或關閉系統顯示通過顯示驅動,并且支持完全的轉義代碼:

  //

  // Defines and structures taken from pwingdi.h in the Platform Builder

  //

  #define QUERYESCSUPPORT 8

  #define SETPOWERMANAGEMENT 6147

  #define GETPOWERMANAGEMENT 6148

  typedef enum _VIDEO_POWER_STATE {

  VideoPowerOn = 1,

  VideoPowerStandBy,

  VideoPowerSuspend,

  VideoPowerOff

  } VIDEO_POWER_STATE, *PVIDEO_POWER_STATE;

  typedef struct _VIDEO_POWER_MANAGEMENT {

  ULONG Length;

  ULONG DPMSVersion;

  ULONG PowerState;

  } VIDEO_POWER_MANAGEMENT, *PVIDEO_POWER_MANAGEMENT;

  //----------------------------------------------------------------------

  // SetVideoPower - Turns on or off the display

  //

  int SetVideoPower (BOOL fOn) {

  VIDEO_POWER_MANAGEMENT vpm;

  int rc, fQueryEsc;

  HDC hdc;

  // Get the display dc.

  hdc = GetDC (NULL);

  // See if supported.

  fQueryEsc = SETPOWERMANAGEMENT;

  rc = ExtEscape (hdc, QUERYESCSUPPORT, sizeof (fQueryEsc),

  (LPSTR)&fQueryEsc, 0, 0);

  if (rc == 0) {

  // No support, fail.

  ReleaseDC (NULL, hdc);

  return -1;

  }

  // Fill in the power management structure.

  vpm.Length = sizeof (vpm);

  vpm.DPMSVersion = 1;

  if (fOn)

  vpm.PowerState = VideoPowerOn;

  else

  vpm.PowerState = VideoPowerOff;

  // Tell the driver to turn on or off the display.

  rc = ExtEscape (hdc, SETPOWERMANAGEMENT, sizeof (vpm),

  (LPSTR)&vpm, 0, 0);

  // Always release what you get.

  ReleaseDC (NULL, hdc);

  return 0;

  }

  前面的代碼通過調用ExtEscape和QUERYESCSUPPORT命令來查詢是否支持轉移代碼。被查詢的命令首先交給輸入緩沖,如果SETPOWERMANAGEMENT命令被支持,程序就填充VIDEO_POWER_MANAGEMENT結構并再次調用ExtEscape設置電源狀態。

  雖然這些轉義代碼允許應用程序打開或關閉顯示,Windows CE沒有一個統一的方式來控制背光的亮度。每個系統都有它自己的OEM特有方式來控制背光亮度。如果將來有一種標準的背光亮度控制方式,它將很可能放在ExtEscape函數中。

 打開電源系統

  當系統被掛起,應用程序將不再運行,因此當系統喚醒時,應用程序看起來沒有被控制。然而,有一些方式來喚醒一個掛起的設備。首先,一個應用程序通過給定一個時間,并使用11章提到的消息API(Notification API)做系統被喚醒的計劃。在一般情況下,OEM廠商會分配一些中斷條件,以便管理系統電源打開,或喚醒。這種方式的一個例子是一個系統當防止了一個同步架(synchronization cradle)時被喚醒。

  防止系統關閉電源

  相反的情況,防止系統掛起也是一個問題。Windows CE系統通常被設置為當一段時間沒有用戶輸入就自動掛起。要防止自動掛起,一個應用程序可以周期性地調用一下函數:

  void WINAPI SystemIdleTimerReset (void);

  這個函數重設Windows CE用來監視用戶輸入的定時器。如果定時器到達預先的沒有用戶輸入的間隔,系統會自動掛起。因為掛起超時值可以被改變,一個應用程序需要知道超時值,這樣就要多一點調用SystemIdleTimerReset。系統維護三個超時值,這些都能夠使用SystemParametersInfo來查詢。傳遞給SystemParametersInfo的常量的不同表現,顯示如下:

  SPI_GETBATTERYIDLETIMEOUT

  當系統運行在電池電源狀態下,離用戶最后輸入的時間

  SPI_GETEXTERNALIDLETIMEOUT

  當系統運行在AC電源狀態下,離用戶最后輸入的時間

  SPI_GETWAKEUPIDLETIMEOUT

  在系統再次掛起時離系統被自動喚醒的時間

  要防止電源被自動掛起,你需要查詢這三個值,并在最短時間內返回之前調用SystemIdleTimerReset。如果超時值被設置為0,表示超時值被禁止。

  電源管理程序

  一個新的,獨立的電源管理組件在Windows CE .NET 4.0中被引入了。這個電源管理程序替代了許多GWES以前完成的函數。電源管理程序定義了一系列的電源狀態,如D0,D1,D2,和D3。這些看起來神秘的名字被對應于一些友好的系統級別名稱。

  對嵌入式" title="嵌入式">嵌入式系統來說,OEM廠商定義了系統的電源狀態。例如,電源狀態可能是打開(On),空閑(Idle)和掛起(Suspend)。其他電源狀態也被定義了,像ScreenOff, InCradle, 和 OnBattery。

  從應用程序的觀點看,新的電源管理程序提供了通知電源狀態改變的能力以及通過一系列的函數統一改變電源狀態的能力。

  系統的電源狀態被定義在注冊表中,SDK定義了PWRMGR_REG_KEY,以致你不得不知道注冊表的字符串,但是當常量沒定義的時間,電源管理程序注冊數據被保留在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power。電源狀態被定義作為子鍵,位于Key State。

  電源通知

  電源管理程序一個十分受歡迎的特點是,可以在系統電源狀態改變時通知應用程序。這可以讓應用程序從手動檢測電源狀態中解脫出來。一個應用程序可以通過調用RequestPowerNotifications請求電源管理程序當電源狀態改變的時候發送一個通知給應用程序。電源管理程序會通過一個由應用程序前面建立的消息隊列發送通知。

  RequestPowerNotifications原型如下。

  HANDLE RequestPowerNotifications (HANDLE hMsgQ, DWORD Flags);

  第一個參數是一個應用程序在之前建立的消息隊列的句柄。第二個參數是一系列參數,表示應用程序想接收的通知。

  PBT_TANSITION

  接受系統電源狀態改變的通知。例如,當系統從On到Suspend。

  PBT_RESUME

  當系統resume的時候接收通知。

  PBT_POWERSTATUSCHANGE

  當系統在AC和電池之間切換的時候接收通知。

  PBT_POWERINFOCHANGE

  當系統電池級數變化時接收通知。

  POWER_NOTIFY_ALL

  接收所有的通知。

  RequestPowerNotifications函數返回一個電源通知的句柄,失敗返回NULL。消息隊列建立的時候必須使應用程序有讀權限,因為應用程序將從消息隊列中讀取電源通知。

  要接收通知,應用程序必須使用WaitForSingleObject來阻塞消息句柄。像第10章所討論的,當通知被放在隊列中時,句柄將被signaled。實際的通知將由結構POWER_BROADCAST表中被接收到。

  typedef struct _POWER_BROADCAST {

  DWORD Message;

  DWORD Flags;

  DWORD Length;

  WCHAR SystemPowerState[1];

  } POWER_BROADCAST, *PPOWER_BROADCAST;

  第一個要注意的是,這個結構長度是可變的。最后一個字段,SystemPowerState,是被定義為WCHARs類型,但是可以填上非字符串數據。第一個字段是通知自己的標識,這個字段可以填前面PBT_標志列表之一。Flags區可以包括以下標志,依賴于被接收的通知:

  POWER_STATE_ON

  系統處于on狀態。

  POWER_STATE_OFF

  系統處于off狀態。

  POWER_STATE_CRITICAL

  系統進入了一個臨界off狀態。

  POWER_STATE_BOOT

  系統正在啟動。

  POWER_STATE_IDLE

  系統進入idle狀態。

  POWER_STATE_SUSPEND

  系統被掛起。

  POWER_STATE_RESET

  系統被復位。

  最后兩個字段是相互關聯的。Length字段是SystemPowerState字段數據的長度。SystemPowerState中包含的數據依賴于被發送的通知。對于PBT_TRANSITION通知來說,SystemPowerState字段包含一個新電源狀態的標識字符串。這個字符串是以非0結尾的。為了結束字符串,使用Length字段來指出字符串的長度。注意,Length字段是以字節為單位的,當字符是雙字節的Uncode字符時,需要獲得字符串字符的長度,就需要用Length字段去除TCHAR的size。

  對于PBT_POWERINFOCHANGE通知來說,SystemPowerState字段包含一個PPOWER_BROADCAST_POWER_INFO結構:

  typedef struct _POWER_BROADCAST_POWER_INFO {

  DWORD dwNumLevels;

  DWORD dwBatteryLifeTime;

  DWORD dwBatteryFullLifeTime;

  DWORD dwBackupBatteryLifeTime;

  DWORD dwBackupBatteryFullLifeTime;

  BYTE bACLineStatus;

  BYTE bBatteryFlag;

  BYTE bBatteryLifePercent;

  BYTE bBackupBatteryFlag;

  BYTE bBackupBatteryLifePercent;

  } POWER_BROADCAST_POWER_INFO, *PPOWER_BROADCAST_POWER_INFO;

  注意,這里有一些字段的名字和函數十分相似于前面討論的SYSTEM_POWER_STATUS_EX2結構。

  設置電源狀態

  電源管理程序提供的函數也允許應用程序來控制電源狀態。有兩個方式來控制電源。第一個方式是應用程序給定一個電源設定。第二個方式是應用程序請求電源狀態不要低于給定的級別。

  一個應用程序通過調用函數SetSystemPowerState可以請求特定的電源狀態。這個函數原型如下。

  DWORD SetSystemPowerState (LPCWSTR psState, DWORD StateFlags,

  DWORD Options);

  電源狀態可以被請求通過指定前兩個參數。如果第一個參數是非零值,它指向一個字符串標識被請求的狀態。這個字符串必須和注冊表中列出的電源狀態之一相匹配。

  如果psState 為 NULL,第二個參數StateFlags,定義了請求的電源狀態。這個參數是從POWER_STATE_ON直到POWER_STATE_RESET狀態其中之一,這些在前面提到的POWER_BROADCAST結構有描述。

  比較特別的是POWER_STATE_RESET標志。這個標志請求系統重起,使用SetSystemPowerState的方法重起比通過直接使用IOCTL_HAL_REBOOT命令來調用KernelIoControl的方法更好。調用 SetSystemPowerState 會讓系統在重起設備之前任何還在緩沖中的數據保存到文件系統。

  調用SetSystemPowerState是一個直接改變電源狀態的方法。更巧妙的方法是通過調用SetPowerRequirement來請求系統維持應用程序所需最低限度的電源狀態。SetSystemPowerState是假定應用程序知道所需狀態,而調用SetPowerRequirement是允許系統對電源設定做優化以滿足應用程序的需要。一個使用SetPowerRequirement會比較方便的例子是,一個使用串口的應用程序需要串口在進行通信時保持住電源狀態。SetPowerRequirement被定義如下。

  HANDLE SetPowerRequirement (PVOID pvDevice,

  CEDEVICE_POWER_STATE DeviceState,

  ULONG DeviceFlags, PVOID pvSystemState,

  ULONG StateFlags);

  第一個參數指定了應用程序需要維護電源狀態的設備。DeviceState參數定義了設備的電源狀態。CEDEVICE_POWER_STATE指定了狀態范圍是從D0(意味著設備是處于最大功耗狀態)到D4(表示設備被關閉)(譯者注:其實D0到D4的狀態的具體表現,完全是由OEM廠商可自定義的,對應用程序開發者來說,比如是在D1關LCD背光還是在D2,都是不確定的,微軟只給出標準定義,而不是實際定義)。DeviceFlags參數由兩個標志合并而成:POWER_NAME,表示設備名有效;POWER_FORCE,表示設備應當維持當前狀態甚至當系統掛起時。如果pvSystemState不為NULL,它表示只有對于在pvSystemState中已命名的電源請求才是有效的。設備可能無法更改請求的狀態。

  應用程序應當注銷通過調用ReleasePowerRequirement來注銷請求,原型如下。

  DWORD ReleasePowerRequirement (HANDLE hPowerReq);

  這里唯一的參數是從SetPowerRequirement里返回的句柄。

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 久久久久国产精品嫩草影院 | 国产精品豆花视频www | 意大利做爰露性器50部 | 欧美男人又粗又长又大 | 国产洗浴女技师全套av | 玩丰满熟妇xxxx视频 | 久久久亚洲国产天美传媒修理工 | 好色999 | 中文字幕亚洲激情 | 黑人性猛爱xxxxx免费 | 欧美一级高潮片 | 婷婷丁香综合 | 日韩一级影视 | 国产精品久久久爽爽爽麻豆色哟哟 | 色欲网天天无码av | 亚洲国产精品成人女人久久 | 男人天堂视频网站 | 免费观看理伦片在线播放 | 日韩一级片在线 | 日韩精品一区二区三区在线观看视频网站 | 一卡二卡三卡视频 | 日本黄色小片 | 久久天天躁夜夜躁狠狠85麻豆 | 国产欧美在线播放 | 亚洲无遮挡 | 欧美激情一区二区三区在线 | 精品丰满人妻无套内射 | 欧美爱爱爱 | 69天堂网| 欧美久草视频 | 亚洲精品在线不卡 | 中文字幕专区 | 女人喷液抽搐高潮视频 | 久久久性 | 亚洲欧美激情精品一区二区 | 交h粗暴调教91 | 嫩草国产福利视频一区二区 | 亚洲v视频 | 人人爽人人爽人人爽 | 欧美日韩日本国产 | 亚洲精品乱码久久久久久蜜桃图片 | 一级片在线免费播放 | 午夜成人在线视频 | 国产成人综合在线观看不卡 | 国内精品视频一区二区三区 | 欧美成人区 | 亚洲精品123区 | 精品久久国产老人久久综合 | 亚洲专区 变态 另类 | 福利一区福利二区 | 刺激一区仑乱 | 欧美色图第一页 | 高潮毛片又色又爽免费 | 性久久久久久久久久久久 | 欧美成人免费高清视频 | 一级特毛片 | 欧美jizzhd精品欧美18 | 欧美在线看片a免费观看 | 国产精品一区二区手机在线观看 | 国产精品乱码一区二区三区视频 | аⅴ资源新版在线天堂 | 国内精品久久久久影院中文字幕 | 国产情侣第一页 | 欧美一区二区三区激情 | 亚洲一区精品二人人爽久久 | 国产高清性xxxxxxxx | 少妇高潮流白浆在线观看 | 国产日产精品一区二区 | 91丨porny丨最新 | 国产精品刘玥久久一区 | 欧美激情视频在线 | 91网页版| 一级全黄少妇性色生活片 | 全部免费的毛片在线播放 | 国产精品综合久久 | 天天躁日日躁很很很躁 | 亚洲精品主播一区二区三区 | 国产jjizz一区二区三区视频 | 91在线视频免费 | 亚洲综合av一区二区三区 | 麻豆影视大全 | 欧美内射深喉中文字幕 | 丰满少妇猛烈进人免费看高潮 | www.成人| 妺妺窝人体色www在线下载 | 久久日本三级韩国三级 | 激情小说一区 | 免费的av网址 | 精品国产区 | 亚洲乱亚洲乱妇无码麻豆 | 国产精品久久久久久久一区探花 | 91青青草视频 | 亚洲天堂网一区二区 | 九月婷婷人人澡人人添人人爽 | 伊人网国产 | 欧洲grand老妇人bbw | 天天摸天天看天天做天天爽 | 黑人一级黄色片 | 日本中文字幕不卡 | 97久久精品无码一区二区 | 国产女人高潮抽搐叫床涩爱小说 | 无码国产精品一区二区免费16 | 免费网站看v片在线观看 | 香蕉国产精品 | 久久精品国产一区二区三区 | 无码色偷偷亚洲国内自拍 | 午夜寂寞影院在线观看 | www178ccom视频在线| 欧美黄色一区二区 | 人妻在线日韩免费视频 | 97国产 | 性色生活片 | 国产精品一v二v在线观看 | 欧美极品少妇xxx | 隣の若妻さん波多野结衣 | 精品亚洲国产成av人片传媒 | 翘臀后进少妇大白嫩屁股 | 亚洲精品久久久一区二区三区 | 少妇高潮久久久久久潘金莲 | 性做久久久久久免费观看欧美 | 国产成人精品无码免费看 | 精品久久久久久亚洲综合网 | 19禁国产精品福利视频 | 精品视频久久久 | 亚洲一区二区精品在线 | 99小视频 | 成人免费毛片网 | 久久97精品国产96久久小草 | 开心激情久久 | 国产男女裸体做爰爽爽 | 尹人香蕉网 | 成年人黄色一级片 | 最新中文av | 色猫成人网| 成人无码精品一区二区三区 | 国产一区精品在线观看 | 91禁在线看 | 亚州av| 亚洲 欧美 激情 小说 另类 | 国产做a爱免费视频在线观看 | 亚洲美女爱爱 | 久久久999国产精品 久久久999精品视频 | 国产一区二区三区四区精 | 日本少妇白嫩猛烈进入免费视频 | 久久久三级 | 亚洲25p| 亚洲色无码国产精品网站可下载 | 狠狠躁夜夜躁人人爽天天 | 亚洲精品成人天堂一二三 | 久久人人爽人人爽人人片ⅴ | 中文字幕av一区二区三区 | 思思久久99热久久精品66 | 亚洲免费精品 | 李丽珍a级裸体啪啪 | 神马久久久久 | 狼人射综合 | 久久久亚洲精华液精华液精华液 | aa视频免费在线观看 | 欧美在线一区二区三区四区 | 久草视频福利在线 | 女优一区二区三区 | 午夜免费国产体验区免费的 | 99色综合网 | 精久国产一区二区三区四区 | 国产精品一区二区欧美黑人喷潮水 | 性色av极品无码专区亚洲 | 免费黄色小视频 | 亚洲欧美视频二区 | 国产成年妇视频 | 深夜爽爽福利 | 欧美日韩性生活视频 | 欧美亚洲另类视频 | 三级免费看 | 国产成人久久婷婷精品流白浆 | 免费看的av网站 | 欧美xxxx黑人又粗又大 | 国产乱子伦视频一区二区三区 | 久久爽精品区穿丝袜 | xxav在线| 青青成人网 | 天天玩夜夜操 | 99精品免费视频 | 四虎黄色片 | 不卡中文字幕在线 | 国产精品成人免费一区久久羞羞 | 成人妇女免费播放久久久 | jizz美女| 视频在线观看免费完整高清中文 | 国产丰满精品伦一区二区三级视频 | 日韩欧美色| 刚添一下她就呻吟起来的视频 | 国产色站 | 午夜免费成人 | 97国产在线播放 | 欧美三日本三级少妇99 | 婷婷色婷婷 | 亚洲精品乱码久久久久久蜜桃 | 日本激情久久 | 黄在线观看 | 农村人伦偷精品视频a人人澡 | 欧美精品高清在线观看 | 久久97视频| 精品欧美h无遮挡在线看中文 | 永久免费无码网站在线观看个 | 欧洲色区 | 欧美日韩免费做爰视频 | 丰满少妇乱子伦精品看片 | 色性网| 久久精品国产精品亚洲 | 麻豆理论片 | 亚洲 成人 av | 神马老子午夜 | 亚洲一区二区三区 | 色www精品视频在线观看 | 国产一区二区在线视频 | 日韩欧美一区二区三区, | 国产又大又黑又粗免费视频 | 永久免费无码网站在线观看 | 久久久久久久久艹 | 欧美综合在线观看视频 | 亚洲黄色小视频在线观看 | 人鳝交video另类hd | 久久综合日本 | 无线日本视频精品 | 欧美日韩一区二区精品 | 天天爽夜夜爽夜夜爽 | 欧美日韩高清在线播放 | 国产乱码一区二区三区在线观看 | 久色影视| 亚洲欧美一区二区三区在线 | 国产综合精品 | 欧美性高潮 | 欧美三级视频在线观看 | 成 人 黄 色 网 页 | 97久久久 | 国产精品av一区二区三区网站 | 日韩三级不卡 | 成人国产一区二区三区 | 国产成人综合亚洲 | 天堂av8| 国产国语老龄妇女a片 | 外国黄色毛片 | 精品性高朝久久久久久久 | a级黄色片免费看 | 久久久国产一区二区三区 | 国产一级80毛片古装片 | 国内精品久久久久久久影视红豆 | 直接在线观看的三级网址 | 国产性色的免费视频网站 | baoyu131成人免费视频 | 国产女主播喷出白浆视频 | 人人爱人人搞 | 美女搞黄在线观看 | 日韩精品免费在线 | 九热精品 | 欧美福利片在线观看 | 超碰人人干 | 亚洲一线av | 极品白嫩丰满少妇无套 | 欧美三区在线观看 | 撸撸在线视频 | 亚洲自拍在线观看 | 人成亚洲| 99久久久久久久久 | 国产精品久久久久久久久侵犯 | 欧美在线免费播放 | 亚洲最大成人网站 | 国产明星精品一区二区刘亦菲 | 久久久精品视频免费看 | 欧美成人免费一区二区三区视频 | 成长快手短视频在线观看 | 欧美人与禽猛交乱配视频 | 啪啪的网站 | 伊人网国产| 中文字幕网伦射乱中文 | 97久久天天综合色天天综合色hd | 波多野结衣乳喷高潮视频 | 99精品视频免费在线观看 | 国产黑丝视频 | 亚洲日韩精品无码专区加勒比 | 欧美日批视频 | 国产男小鲜肉同志免费 | 国产精品一区久久久 | 中文字幕亚洲欧美日韩 | 国产九区 | 国产伦精品一区二区三区视频我 | 欧美裸体摔跤xxxx | 久久一区欧美 | 怡红院av久久久久久久 | 四虎国产精品成人免费4hu | 成人做爰66片免费看网站 | 丁香六月综合激情 | 在线地址一地址二免费看 | 天堂av播放| 久久99精品波多结衣一区 | 亚洲国产成人无码av在线影院 | 人妻无码久久一区二区三区免费 | 国产一区在线播放 | 国产精品久久一区性色av图片 | 无遮挡19禁啪啪成人黄软件 | 久久精品视频中文字幕 | 亚洲日批 | 少妇裸体长淫交视频免费观看 | 国产精品久久久久久久久侵犯 | 99热国 | 久久乐国产精品亚洲综合 | 92精品国产成人观看免费 | 国产日产精品一区二区三区四区介绍 | 国产精品久久一区二区三区动漫 | 美女拉屎视频pooping | 国产高潮久久久久久绿帽 | 久久久久久一区二区三区四区别墅 | 中文字幕精品一区二区三区精品 | 久久久久人妻啪啪一区二区 | 狠狠撸视频| 日日摸夜夜添夜夜爽免费视频 | 国产精品久久久久久久久久久痴汉 | 男男野外做爰全过程69 | 又色又爽又黄的视频软件app | 国产91调教 | yw在线观看 | 精品在线一区二区三区 | 国产乱了真实在线观看 | 亚洲图片欧美在线看 | av av在线 | 久热免费在线视频 | 日日操狠狠干 | 人人草人人做人人爱 | 免费视频爱爱太爽了 | 揉捏奶头高潮呻吟视频 | 无码人妻精品丰满熟妇区 | 在线a久青草视频在线观看 无套内射极品少妇chinese | 国产免费观看久久黄av片 | 情五月 | 日韩欧美一区二区三区免费观看 | 91麻豆精品国产91久久久久久久久 | 人人做人人爱人人爽 | 性仑少妇av啪啪a毛片 | 大胆欧美gogo免费视频一二区 | 影音先锋女人av鲁色资源网久久 | 欧美精品一区二区三区在线 | 成人免费黄色网 | 久久夜色精品国产噜噜av | 热逼视频 | 久久久婷婷 | 东北少妇露脸无套对白 | 天堂av手机版 | 欧美日批 | 亚洲青草 | 成人免费视频在线观看 | 最新中文字幕在线观看视频 | 91干干干| www.久久久久 | 92看片淫黄大片看国产片 | 黄色一级毛片 | 亚洲人交配 | 夹得我好紧好爽日出了水视频 | 色av性av丰满av | 国产精品欧美久久久久天天影视 | 欧美在线三区 | 亚洲色图欧美日韩 | 国产一区二区三区高清在线观看 | 日欧美女人 | 女女百合av大片一区二区三区九县 | 天堂国产女人av | 国产精品无码制服丝袜 | 国产精品一级二级三级 | 变态美女紧缚一区二区三区 | 男人的天堂av片 | caoprom97| 九九久久99| 性xxxx尼泊尔娇小视频 | 国产成人精品一区二区三区在线观看 | 九九视频免费在线观看 | 亚洲va在线 | 国产69精品久久久久777 | 日韩三级一区二区 | 亚洲精品一区国语对白 | 国产无区一区二区三麻豆 | 亚洲区欧美区综合区自拍区 | 国产亚洲精品成人av久久ww | 国产狂喷潮在线观看 | 老头老太吃奶xb视频 | 黄色成人av | 亚洲一级二级三级 | 在线一区二区三区做爰视频网站 | 久久综合久久久久 | 免费成人高清在线视频 | 伊人成色综合网 | 亚洲精品你懂的 | 国模少妇一区二区三区 | 欧美成人3d啪啪动漫 | 日本免费网址 | 91成品人影院 | aa视频免费在线观看 | 欧美一本乱大交性xxxⅹ | 亚洲综合欧美日韩 | 青少年xxxxx性开放hg | 国产一区第一页 | 中文字幕日韩精品无码内射 | 亚洲精品sm一区二区 | 蜜臀av免费一区二区三区 | 日韩在线不卡免费视频一区 | 最近中文字幕在线观看 | 丝袜脚交一区二区三区 | 天堂中文在线8最新版精品版软件 | 欧美精品系列 | 日韩 欧美 亚洲 精品 少妇 | 国产最爽乱淫视频国语对白 | 四虎国产精品成人免费4hu | 天天做天天爱天天爽综合网 | 少妇被爽到高潮喷水久久欧美精品 | 西西人体大胆午夜视频 | 久久本道综合久久伊人 | 66m66成人摸人视频 | 亚洲精品一区二区三区不卡 | 天堂中文字幕av | 欧美成人精品一区二区三区在线观看 | 婷婷色网 | 国产一区二区视频在线 | 一区二区国产精品精华液 | 亚洲精品无人区 | 美女黄站 | 少妇高清精品毛片在线视频 | 色播激情| 国产三级欧美三级日产三级99 | 国产在线视频一区二区 | 国产精品网页 | 热九九精品 | 久久视频在线观看精品 | 亚洲精品免费看 | 国产一级一片免费播放 | 国产99在线 | 欧美 | 欧美精品亚洲一区 | 污污污污污污www网站免费 | 91狠狠干| 久久99热这里只频精品6学生 | 黄色动漫在线免费观看 | 日本午夜免费福利视频 | 第一宅男av导航入口 | 极品尤物魔鬼身材啪啪仙踪林 | 国产国产精品人在线观看 | 国产免费又爽又色又粗视频 | 亚洲va欧美va国产综合剧情 | 网站黄色在线免费观看 | 成 人 黄 色视频免费播放 | 黄色视屏网站 | 欧美一区网站 | 99久久精品免费看国产一区二区三区 | 日日噜噜夜夜狠狠久久波多野 | a级高清免费毛片av播放 | 久久久精品成人免费观看 | 国产真实伦在线观看视频 | 华人在线| 欧美69wwwcom| 日韩欧美群交p片內射中文 三级4级全黄60分钟 | 色婷婷av国产精品 | 久草剧场 | 午夜一级免费 | 91精品国产综合久久精品 | 国产高清视频在线免费观看 | 中出乱码av亚洲精品久久天堂 | 另类激情亚洲 | 欧美激情综合在线 | 狠狠色狠狠色合久久伊人 | 丰满人妻精品国产99aⅴ | 女女百合高h喷汁呻吟玩具 女女互揉吃奶揉到高潮视频 | 久久久久久免费精品 | 天堂网www网在线最新版 | 成人免费黄色大片 | 小泽玛利亚一区二区三区视频 | 福利在线免费视频 | 日本在线高清不卡免费播放 | www97色| 亚洲色图p| 亚洲黄色免费在线观看 | 国产亚洲日韩欧美另类第八页 | 韩国成人在线视频 | 中文字幕一区二区三区乱码 | 欧美一区二区视频在线 | 69视频国产 | 37p粉嫩大胆色噜噜噜 | 97夜夜澡人人爽人人喊91洗澡 | 欧美成人午夜影院 | 黄色高清视频在线观看 | 麻豆精品一区综合av在线 | 亚洲精品国产精品久久99热 | av不卡中文字幕 | 成人三级做爰视频在线看 | 欧美不卡在线视频 | 奇米影视888 | 日韩一区二区欧美 | 四虎国产精品免费久久 | 动漫人妻h无码中文字幕 | 天天综合网在线 | 亚色中文成人yase999co | 欧美日韩一区二区在线 | 欧美激情一区二区三区成人 | 激情伊人五月天久久综合 | 欧美女优在线 | 亚洲国产精品女人 | 精品久久久久久中文字幕2017 | 免费观看交性大片 | 鲁丝一区二区三区 | 男女无遮挡做爰猛烈黄文 | xnxx国产精品hd | 久久99精品久久只有精品 | 亚洲精品aaaa乱码 | 可以免费观看的毛片 | 高清不卡一区二区三区 | 亚洲色18禁成人网站www | 成人免费一区二区 | 日韩国产精品一区二区三区 | 99久久国产露脸国语对白 | 婷婷在线看 | 久久婷婷五月综合色欧美 | 神马午夜激情 | 欧美又大又色又爽aaaa片 | 偷拍成人一区亚洲欧美 | 99精品一区二区 | 中文字幕在线观看你懂的 | 在线视频 中文字幕 | 成人性做爰av片免费看 | 一本色道无码道dvd在线观看 | 毛片av网站 | 久久九九免费视频 | 久久国产精品精品国产色婷婷 | 成人性生活大片免费看ⅰ软件 | 免费国产黄网站在线观看可以下载 | 激情小说五月天 | 成人激情四射网 | 欧美日韩国产一区二区三区 | 少妇偷乱偷乱视频在线 | 久久精品无码精品免费专区 | 日本japanese丰满白浆 | 天天干天天日夜夜操 | 色婷婷av一区二区三区gif | 亚洲国产欧洲综合997久久, | 欧美性xxxxx极品少妇偷拍 | 亚洲国产精品久久精品怡红院 | 日韩精品无码中文字幕一区二区 | 亚洲高清av在线 | 狠狠干在线观看 | 色爽av | 日韩欧美一区二区三区黑寡妇 | 国产乱码精品一区二区三区中文 | 亚洲dvd| 四虎com| 嫖妓丰满肥熟妇在线精品 | 成人黄色在线观看 | 午夜视频在线观看入口 | mm1313亚洲国产精品无码试看 | 久久精品国产sm调教网站演员 | 日本特黄特黄刺激大片 | 日本三级理论久久人妻电影 | ass亚洲肉体欣赏pics | 青青久草网 | 伊人精品一区二区三区 | 一本色道久久综合亚洲精品婷婷 | 午夜私人影院 | 色就是色亚洲色图 | 亚洲色tu| 女人爽到高潮潮喷18禁网站 | 亚洲另类xxxx| 无码av中文一区二区三区桃花岛 | 26uuu精品一区二区在线观看 | 中文字幕国产专区 | 日韩国产传媒 | 青青草五月天 | 四虎影库在线永久影院免费观看 | 爱逼av| 五月天中文字幕 | 日韩亚洲欧美一区二区 | 欧美激情综合亚洲一二区 | 日韩专区在线 | 日本无遮真人祼交视频 | 女神思瑞女神久久一区二区 | 人妻少妇精品久久 | 亚洲无线码在线一区观看 | 久久免费一级片 | 色多多性虎精品无码av | 在线一区二区三区做爰视频网站 | 狠狠激情 | 快射视频网 | 成人性生交大全免 | 国产偷v国产偷v精品视频 | 国产精品yy | 丰满饥渴的少妇hd | 久久久久久久性潮 | 色综合福利 | 丁香六月婷婷开心婷婷网 | 51精品国自产在线 | 亚洲精品一区中文字幕乱码 | 极品销魂美女一区二区 | 男人天堂av在线播放 | 日韩在线观看一区 | 水野朝阳av一区二区三区 | 精品在线视频播放 | 国产丰满精品伦一区二区三级视频 | 在线视频一区二区三区四区 | 欧美亚洲伦理 | 欧美色图校园春色 | 国产精品jizz在线观看老狼 | www久久avcom| 欧美z○zo变态重口另类黄 | 成人高清视频免费观看 | 欧美日韩中文字幕在线视频 | 国内精品国产三级国产在线专 | 国产又黄又爽又色的免费 | 成年午夜无码av片在线观看 | 欧美自拍另类欧美综合图片区 | 懂色av一区二区三区免费 | 亚洲精品乱码久久久久久写真 | 成人性生交大片免费看r链接 | 91精品国产91久久综合 |