我需要通过在注册表项HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Power \ User \ PowerSchemes中更改它来设置ActivePowerScheme。 所以我尝试用winapi函数RegOpenKeyEx和RegSetValueEx
来做wchar_t *PowerScheme=TEXT("8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c");
HKEY hRootKey = HKEY_LOCAL_MACHINE;
PWCHAR sKey = TEXT("SYSTEM\\CurrentControlSet\\Control\\Power\\User\\PowerSchemes");
PWCHAR sActivePowerS = TEXT("ActivePowerScheme");
HKEY hKeyResult = NULL;
//open
if (RegOpenKeyEx(hRootKey,sKey,0,KEY_ALL_ACCESS,&hKeyResult)!=ERROR_SUCCESS) {
//it is always failing with error 0 !
DWORD dw = GetLastError();
}
但RegOpenKeyEx()始终失败,错误为0,表示“操作已成功完成”。并且RegSetValueEx()返回相同的值。
if(RegSetValueEx(hKeyResult,sActivePowerS,0,REG_SZ,
(BYTE *)PowerScheme,wcslen(PowerScheme))!=ERROR_SUCCESS) {
//it is always failing with error 0
DWORD dw = GetLastError();
}
当然,目前的电力方案不会改变价值。但根据msdn: “如果函数成功,则返回值为ERROR_SUCCESS。 如果函数失败,则返回值为非零错误代码“。
我将非常感谢你的答案。
P.S。它在Windows 7中编译并以admin
的权限执行答案 0 :(得分:1)
你这是错误的方式。您需要自己更改注册表中的内容。
在MSDN网站上阅读Power Scheme Management,了解正确的方法。
答案 1 :(得分:1)
作为documentation states,RegOpenKeyEx
不会更新GetLastError
,返回值就是错误代码本身。你介意检查一下吗?
我敢打赌你这里有ERROR_ACCESS_DENIED
错误。
UPD:虽然这可能会回答您的问题,但您应该考虑使用RedX建议的API来更新电源管理设置。此注册表项的权限是设置的(出于某种原因!),即使管理员只具有读取权限,也不会写入。
答案 2 :(得分:1)
在评论中,您声明RegOpenKeyEx
返回ERROR_ACCESS_DENIED
。这是因为您请求对由于UAC而没有足够权限的密钥进行写访问。您需要提升您的进程以写入此密钥。
正如其他人已经正确指出的那样,您不应该调用GetLastError
,因为RegOpenKeyEx
没有设置最后一个错误值,而是直接返回错误代码。更重要的是,您应该使用电源管理API而不是破解注册表。
即使您切换到电源管理API,您仍然需要管理员权限。您可以通过在application manifest中将requestedExecutionLevel
设置为requireAdministrator
来安排此操作。
在Visual Studio中,您可以在“链接器”下的项目配置中进行此更改清单文件| UAC执行级别。