通过WMI的方式去设置LCD背光亮度

code如下:

#include "stdafx.h"
#include <objbase.h>
#include <windows.h>                                    
#include <stdio.h>
#include <wbemidl.h>
#include <comdef.h>

#pragma comment(lib, "wbemuuid.lib")
#pragma comment(lib, "comsuppw.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    IWbemLocator 	* pLocator = NULL;
    IWbemServices 	* pNamespace = 0;
    IWbemClassObject * pClass = NULL;
    IWbemClassObject * pInClass = NULL;
    IWbemClassObject * pInInst = NULL;
	IEnumWbemClassObject *pEnum = NULL;
	HRESULT hr = S_OK;
 
    BSTR path = SysAllocString(L"root\\wmi");
    BSTR ClassPath = SysAllocString(L"WmiMonitorBrightnessMethods");
    BSTR MethodName = SysAllocString(L"WmiSetBrightness");
    BSTR ArgName0 = SysAllocString(L"Timeout");
	BSTR ArgName1 = SysAllocString(L"Brightness");
	BSTR bstrQuery = SysAllocString(L"Select * from WmiMonitorBrightnessMethods");

	if (!path || ! ClassPath || !MethodName || ! ArgName0)
	{
		printf("SysAllocString failed. Out of memory.\n");
		{printf("\n[-] Err: xxx");goto cleanup;}
	}

    // Initialize COM and connect up to CIMOM

    hr = CoInitialize(0);
	if (FAILED(hr))
	{
		printf("CoInitialize returned 0x%x:", hr);
		{printf("\n[-] Err: CoInitialize");goto cleanup;}
	}

	//  NOTE:
	//  When using asynchronous WMI API's remotely in an environment where the "Local System" account
	//  has no network identity (such as non-Kerberos domains), the authentication level of
	//  RPC_C_AUTHN_LEVEL_NONE is needed. However, lowering the authentication level to
	//  RPC_C_AUTHN_LEVEL_NONE makes your application less secure. It is wise to
	// use semi-synchronous API's for accessing WMI data and events instead of the asynchronous ones.

    hr = CoInitializeSecurity(NULL,
							-1,
							NULL,
							NULL,
							RPC_C_AUTHN_LEVEL_DEFAULT,
							RPC_C_IMP_LEVEL_IMPERSONATE,
							NULL,
							EOAC_NONE, //change to EOAC_NONE if you change dwAuthnLevel to RPC_C_AUTHN_LEVEL_NONE
							NULL );
	if (FAILED(hr))
	{
		printf("CoInitializeSecurity returned 0x%x:", hr);
		{printf("\n[-] Err: CoInitializeSecurity");goto cleanup;}
	}

    hr = CoCreateInstance(CLSID_WbemLocator,
						0,
						CLSCTX_INPROC_SERVER,
						IID_IWbemLocator,
						(LPVOID *) &pLocator);
	if (FAILED(hr))
	{
		printf("CoCreateInstance returned 0x%x:", hr);
		{printf("\n[-] Err: CoCreateInstance");goto cleanup;}
	}
    hr = pLocator->ConnectServer(path,
								NULL,
								NULL,
								NULL,
								0, 
								NULL,
								NULL, 
								&pNamespace);
    printf("\nConnectServer returned 0x%x:", hr);
    if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: ConnectServer");goto cleanup;}

	hr = CoSetProxyBlanket(pNamespace,
						RPC_C_AUTHN_WINNT,
						RPC_C_AUTHZ_NONE,
						NULL,
						RPC_C_AUTHN_LEVEL_CALL,
						RPC_C_IMP_LEVEL_IMPERSONATE,
						NULL,
						EOAC_NONE);

    if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: CoSetProxyBlanket");goto cleanup;}

	hr =pNamespace->ExecQuery(_bstr_t(L"WQL"), //Query Language
							bstrQuery, //Query to Execute
							WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, //Make a semi-synchronous call
							NULL, //Context
							&pEnum /*Enumeration Interface*/);

   if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: ExecQuery");goto cleanup;}
 
	hr = WBEM_S_NO_ERROR;

	ULONG ulReturned;
	IWbemClassObject *pObj;
	DWORD retVal = 0;

	//Get the Next Object from the collection
	hr = pEnum->Next(WBEM_INFINITE, //Timeout
					1, //No of objects requested
					&pObj, //Returned Object
					&ulReturned /*No of object returned*/);

	if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: Next");goto cleanup;}

	// Get the class object
	hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
	printf("\nGetObject returned 0x%x:", hr);
	if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: GetObject");goto cleanup;}

	// Get the input argument and set the property
	hr = pClass->GetMethod(MethodName, 0, &pInClass, NULL);
	printf("\nGetMethod returned 0x%x:", hr);
	if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: GetMethod");goto cleanup;}

	hr = pInClass->SpawnInstance(0, &pInInst);
	printf("\nSpawnInstance returned 0x%x:", hr);
	if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: SpawnInstance");goto cleanup;}

	VARIANT var1;
	VariantInit(&var1);

	V_VT(&var1) = VT_BSTR;
	V_BSTR(&var1) = SysAllocString(L"0");
	hr = pInInst->Put(ArgName0,
					0,
					&var1,
					CIM_UINT32); //CIM_UINT64

	//var1.vt = VT_I4;
	//var1.ullVal = 0;
	//hr = pInInst->Put(ArgName0, 0, &var1, 0);
	printf("\nPut ArgName0 returned 0x%x:", hr);
	VariantClear(&var1);
	if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: Put ArgName0");goto cleanup;}

	VARIANT var;
	VariantInit(&var);

	V_VT(&var) = VT_BSTR;
	V_BSTR(&var) = SysAllocString(L"100");
	hr = pInInst->Put(ArgName1,
					0,
					&var,
					CIM_UINT8); 

	//var.vt=VT_UI1;
	//var.uiVal = 100;
	//hr = pInInst->Put(ArgName1, 0, &var, 0); 
	VariantClear(&var);
	printf("\nPut ArgName1 returned 0x%x:", hr);
	if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: Put ArgName1");goto cleanup;}
	// Call the method

	VARIANT pathVariable;
	VariantInit(&pathVariable);

	hr = pObj->Get(_bstr_t(L"__PATH"),
				0,
				&pathVariable,
				NULL,
				NULL);
	printf("\npObj Get returned 0x%x:", hr);
	if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: Get");goto cleanup;}

	hr =pNamespace->ExecMethod(pathVariable.bstrVal,
							MethodName,
							0,
							NULL, 
							pInInst,
							NULL, 
							NULL);
	VariantClear(&pathVariable);
	printf("\nExecMethod returned 0x%x:", hr);
	if(hr != WBEM_S_NO_ERROR)
		{printf("\n[-] Err: ExecMethod");goto cleanup;}

	printf("Terminating normally\n");

// Free up resources
cleanup:
    SysFreeString(path);
    SysFreeString(ClassPath);
    SysFreeString(MethodName);
    SysFreeString(ArgName0);
	SysFreeString(ArgName1);
	SysFreeString(bstrQuery);

	if (pClass)	pClass->Release();
	if (pInInst) pInInst->Release();
	if (pInClass) pInClass->Release();
	if (pLocator) pLocator->Release();
	if (pNamespace) pNamespace->Release();
	
    CoUninitialize();
    
	return 0;
}


### 使用C++WMI接口设置显示器亮度 为了实现通过C++编程语言利用Windows管理规范(WMI)来调整显示器的亮度,可以采用如下方法: #### 创建并初始化COM库环境 由于WMI依赖于组件对象模型(COM),因此程序启动时需调用`CoInitializeEx()`函数完成必要的初始化工作。 ```cpp HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hr)) { // Initialization failed. } ``` #### 连接到本地命名空间根\cimv2下的服务实例 建立到特定路径的服务连接以便后续操作硬件属性。这一步骤涉及创建IWbemLocator指针并通过该指针获取对目标名称空间内服务对象的访问权限[^1]。 ```cpp IWbemLocator *pLoc = NULL; hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc); BSTR strNetworkResource = SysAllocString(L"ROOT\\wmi"); IWbemServices* pSvc = NULL; // Connect to the WMI namespace. hr = pLoc->ConnectServer(strNetworkResource, NULL, NULL, 0, NULL, 0, 0, &pSvc); SysFreeString(strNetworkResource); ``` #### 设置安全级别以及执行查询语句检索相关类的信息 为了让应用程序能够成功地读取或修改系统配置参数,还需要适当提升进程的安全上下文,并构建WQL查询字符串以定位所需的WMI类别——在此案例中为`WmiMonitorBrightnessMethods`。 ```cpp // Set security levels on the proxy. COAUTHIDENTITY authIdent{}; authIdent.User = const_cast<OLECHAR*>(L"user"); // Replace with actual user name if required authIdent.Password = const_cast<OLECHAR*>(L"password"); // Replace with actual password if required authIdent.Domain = nullptr; authIdent.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; hr = CoSetProxyBlanket( pSvc, RPC_C_AUTHN_DEFAULT, RPC_C_AUTHZ_NONE, COLE_DEFAULT_PRINCIPAL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, &authIdent, EOAC_NONE ); IEnumWbemClassObject* pEnumerator = NULL; hr = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM WmiMonitorBrightnessMethods"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); ``` #### 调整屏幕亮度的具体过程 一旦获得了指向所需WMI类的对象枚举器之后,则可以通过遍历这些对象找到对应的方法来进行实际的操作;对于改变显示设备光强度而言,就是寻找名为`WmiSetBrightness`的方法,并传递合适的参数值给它来达到目的。 ```cpp ULONG uReturn = 0; IWbemClassObject* pclsObj = NULL; while(pEnumerator){ HRESULT hrNext = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); VARIANT vtProp; VariantInit(&vtProp); // Call method "WmiSetBrightness" IWbemClassObject* inParams = NULL; hr = pclsObj->GetMethod_(L"WmiSetBrightness", 0, &inParams, NULL); long brightnessLevel = 50; // Desired brightness level between 0 and 100% SAFEARRAYBOUND bounds[1]; bounds[0].lLbound = 0; bounds[0].cElements = 1; CComSafeArray<VARIANT> saValues(bounds); saValues.SetAt(0, _variant_t((long)brightnessLevel)); CComVariant varInParams(saValues.Detach()); CComVariant varOutParams; hr = pSvc->ExecMethod(_bstr_t("WmiMonitorBrightnessMethods"), L"WmiSetBrightness", 0, NULL, &varInParams, &varOutParams, NULL ); } // Cleanup code here... ``` 上述代码片段展示了如何借助WMI API在C++环境中控制外部监视器或其他支持此功能的视频输出装置的亮度调节机制。需要注意的是,在真实的应用场景下应当更加严谨地处理错误情况并且遵循最佳实践指南确保软件稳定性和安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值