WIN7创建新的电源模式(Power Scheme)

2019-07-13 22:05发布

  前面我有一个创建新的电源模式各个函数的介绍,今天在更新点东西,在系统下需要在每次运行自己的程序的时候都要检测程序是否已经创建了 自己的电源模式,如果没有则创建,如果有了就不创建了,可是怎么来判断是否创建了自己的电源模式呢?本代码是基于网上一个人的修改版,记录下来,做个参考。 AddNewPowerScheme() { LANGID SystemLangID;
 LANGID PrimaryLanguageID, SubLanguageID;
 GUID SearchSchemeGuid;                              //用來記錄尋找到的scheme GUID
 TCHAR* pCreateNameBuf =_T("超级节能");   //要產生新的power scheme的名稱, 一開始會先拿來比 對原先的power scheme中有沒有該名稱
 GUID*  pPreActiveScheme;                            //记录开机的当前电源模式
 BOOL bIsPowerSchemeCreated = FALSE;    //紀錄是否已經產生了要產生的power scheme
 ULONG SearchSchemeIndex = 0;
 DWORD SearchBufferSize = (DWORD)sizeof(GUID);  SystemLangID = GetSystemDefaultLangID();       //判断当前操作系统的语言版本
 PrimaryLanguageID = SystemLangID & 0x03FF;
 SubLanguageID = SystemLangID>>10;
    if(PrimaryLanguageID == LANG_ENGLISH)
 {
     pCreateNameBuf =_T("Super energy-saving");
 }
 while (0 == PowerEnumerate(NULL, NULL, NULL, ACCESS_SCHEME, SearchSchemeIndex, (PUCHAR)&SearchSchemeGuid, &SearchBufferSize))
 {
  TCHAR pSearchSchemeBuf[2*MAX_PATH];                //这里一定要注意,预留空间一定要够大,否则调用PowerReadFriendlyName 在有些环境下会失败
  DWORD dwSearchSchemeSize =2* MAX_PATH;
  PowerReadFriendlyName(NULL, (GUID*)&SearchSchemeGuid, NULL, NULL, (PUCHAR)pSearchSchemeBuf, &dwSearchSchemeSize);     //讀取power scheme的名稱 
//將search出來的power scheme名稱從widechar轉換成multibyte(因為win7使用的是widechar, 但舊的vs2005開發環境只認識multibyte, 所以要做轉換) (这里有问题,我一直以为VS2008也是这样的,可是经过单步跟踪才知道这里有问题,所以注释调了)
   // WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pSearchSchemeBuf, -1, (LPSTR)szSearchName, MAX_PATH, NULL, NULL);
  
  if(_tcscmp(pCreateNameBuf,pSearchSchemeBuf)==0)                      //如果找到相同名稱的scheme, 就不需要再產生新的power scheme
  {
   bIsPowerSchemeCreated = TRUE;
   myNewPowerScheme=SearchSchemeGuid;
   break;
  }
  SearchSchemeIndex++;                          //繼續尋找下一個power scheme
 }  if(!bIsPowerSchemeCreated)                          //如果該power scheme尚未create, 就開始產生新的scheme, 產生的方式是用複製的現有的方式再去改power scheme的name成為我們所要的
 {
//同樣的將MultiByte轉換成win7可認得的WideChar
  TCHAR* wszCreateName=_T("超级节能");
  if(PrimaryLanguageID == LANG_ENGLISH)
  {
   wszCreateName =_T("Super energy-saving");
  }
  GUID FAR MySubGroupOfPowerSettingsGuid={0xbc5038f7, 0x23e0, 0x4960, {0x96, 0xda, 0x33, 0xab, 0xaf, 0x59, 0x35, 0xec} };     //处理器最大的性能状态
  MultiByteToWideChar(CP_ACP, 0,(LPCSTR) pCreateNameBuf, -1,(LPWSTR)wszCreateName, _MAX_PATH);
  //現在被設定啟用的power scheme
  //GUID*  pPreActiveScheme;
  DWORD dwCreateNameSize = _MAX_PATH;
  //紀錄複製出來的power scheme GUID
  GUID* pDuplicateScheme = NULL;                                  //取得目前設定啟用的scheme
                                 //PowerGetActiveScheme(NULL, &pPreActiveScheme);
                                 //複製現用的power scheme
  PowerDuplicateScheme(NULL,&GUID_POWER_SAVER, &pDuplicateScheme);
                                 //將複製出來的scheme重新命名為先前所設定的
  PowerWriteFriendlyName(NULL, pDuplicateScheme, NULL, NULL, (UCHAR*)wszCreateName, dwCreateNameSize);
                                 //透過PowerWriteDCValueIndex 或者  PowerWriteACValueIndex 這個api設定想要設定的值到新的scheme中 (DC是for 使用電池, AC是for 插電的時候)
                                 // PowerWriteDCValueIndex(NULL, pDuplicateScheme, &GUID_USB_SUBGROUP, &GUID_USB_SELETIVE_SUSPEND, USB_ENABLED);
                                 //....
  myNewPowerScheme=*pDuplicateScheme;
  if(ERROR_SUCCESS==
   PowerWriteDCValueIndex(
   NULL,
   pDuplicateScheme,
   &GUID_PROCESSOR_SETTINGS_SUBGROUP,
   &MySubGroupOfPowerSettingsGuid,                       // &NO_SUBGROUP_GUID,
   0x32
   ))
  {
  }
  else
  {
  }
 //改完所有數值後, 最重要的一個步驟, 將新的scheme設定成active即完成使用新的power scheme
  //PowerSetActiveScheme(NULL, pDuplicateScheme);
 }
 else
 {
  PowerGetActiveScheme(NULL, &pPreActiveScheme);
  if((*pPreActiveScheme!=GUID_POWER_SAVER)&&(*pPreActiveScheme!=GUID_BALANCED)&&(*pPreActiveScheme!=GUID_HIGH_PERFORMANCE))
  {
   //myNewPowerScheme=*pPreActiveScheme;
   myDefaultPowerScheme=GUID_BALANCED;
   PowerSetActiveScheme(NULL, &myDefaultPowerScheme);
  }
 } }