如何在C ++中获取Windows 7中所有电源方案的名称?

时间:2014-05-13 21:47:43

标签: c++ windows enumeration

我必须在Windows 7中获取所有可用电源方案的名称。我尝试使用电源管理功能枚举它们,但我确实得到了正确的数量但是当我打电话给#34; 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种电源方案(高性能,平衡,省电)始终有效。

所以我认为它与自定义方案有关,我手动添加了2个以上。但事实证明,其中一个实际上有效,我可以得到它的名字(两者都来自平衡)。

然后我手动添加了另外两个自定义方案(这次是从节电器中获得),这次两者似乎都有效。我现在共有9个,我可以得到其中6个的名字。我无法得到2个原始自定义电源方案的名称(均来自平衡)以及我第一次添加的第2个。

当我输入" powercfg -list"在控制台中,我可以获得所有电源方案的列表,但是如何在不重定向/解析控制台但使用Windows电源管理功能的情况下,在c ++中可靠地获取所有电源方案的名称?

1 个答案:

答案 0 :(得分:2)

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;
    }
}