我必须在Windows 7中获取所有可用电源方案的名称。我尝试使用电源管理功能枚举它们,但确实获得了正确的数量,但是当我调用“PowerReadFriendlyName”(http://msdn.microsoft.com/en-us/library/windows/desktop/aa372740%28v=vs.85%29.aspx)时,它有时会工作,有时会失败:
UCHAR displayBuffer[256];
DWORD displayBufferSize = sizeof(displayBuffer);
GUID buffer;
DWORD bufferSize = sizeof(buffer);
int index;
int fail=0,ok=0;
//
for(index = 0 ; ; index++)
{ ZeroMemory(&buffer, sizeof(buffer));
ZeroMemory(&displayBuffer, sizeof(displayBuffer));
if (PowerEnumerate(NULL,NULL,NULL, ACCESS_SCHEME,index,(UCHAR*)&buffer,&bufferSize) == ERROR_SUCCESS)
{ if (PowerReadFriendlyName(NULL, &buffer,&NO_SUBGROUP_GUID,NULL,displayBuffer,&displayBufferSize) == ERROR_SUCCESS)
{ ok++;
// stuff to todo
}
else
{ fail++;
// why?
}
}
else
{ break;
}
}
最初,我有2种自定义电源方案,并且其名称检索始终失败。标准的3种电源方案(高性能,平衡,省电)始终有效。
因此,我认为这与自定义方案有关,我手动添加了其中两个。但事实证明,其中一个实际上可以正常工作,我可以得到它的名字(两者均来自Balanced)。
然后,我手动添加了另外两个自定义方案(这一次来自节电),这一次似乎都可以。我现在总共有9个人,我可以得到6个人的名字。我无法获得2种原始自定义电源方案的名称(均来自平衡)以及我第一次添加的方案中的第二种。
当我在控制台中键入“powercfg -list”时,可以获得所有电源方案的列表,但是如何在c++中可靠地获取所有电源方案的名称,而无需重定向/解析控制台但使用Windows电源管理功能?
最佳答案
PowerReadFriendlyName()函数的文档中没有提到保存缓冲区长度的变量在使用非NULL缓冲区的成功调用中将被覆盖。因此,必须在每次调用PowerReadFriendlyName()之前设置它,否则它可能会失败:
UCHAR displayBuffer[2048];
DWORD displayBufferSize;
GUID buffer;
DWORD bufferSize = sizeof(buffer);
int index;
int fail=0,ok=0;
//
for(index = 0 ; ; index++)
{ ZeroMemory(&buffer, sizeof(buffer));
ZeroMemory(&displayBuffer, sizeof(displayBuffer));
if (PowerEnumerate(NULL,NULL,NULL, ACCESS_SCHEME,index,(UCHAR*)&buffer,&bufferSize) == ERROR_SUCCESS)
{ displayBufferSize = sizeof(displayBuffer);
if (PowerReadFriendlyName(NULL, &buffer,&NO_SUBGROUP_GUID,NULL,displayBuffer,&displayBufferSize) == ERROR_SUCCESS)
{ ok++;
// stuff to todo
}
else
{ fail++;
}
}
else
{ break;
}
}
关于c++ - 如何在C++中的Windows 7中获得所有电源使用方案的名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23642164/