我必须在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/

10-13 06:17