MS网站上给出了用Power Shell的方式用来设置/获取Brightness的值。
为了方便使用,将相关接口进行了封装:
#pragma once
#include <initguid.h>
#include <cguid.h>
#include <atlcomcli.h>
#include <atlcoll.h>
#include <comdef.h>
#include <WbemIdl.h>
#pragma comment(lib, "wbemuuid.lib")
typedef void (*PFN_CALLBACK)(DWORD dwBrightness, LPVOID lpContext);
class CBrightnessCtrl : public IWbemObjectSink
{
public:
CBrightnessCtrl(PFN_CALLBACK pCallback, LPVOID lpContext);
~CBrightnessCtrl(void);
public:
inline BOOL VerifyValid(void) { return (NULL != this) ? m_bValid : FALSE; }
BOOL Get(DWORD* pdwValue);
BOOL Set(DWORD dwValue);
public:
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv);
virtual HRESULT STDMETHODCALLTYPE Indicate(LONG lObjectCount, IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray);
virtual HRESULT STDMETHODCALLTYPE SetStatus(
/* [in] */ LONG lFlags,
/* [in] */ HRESULT hResult,
/* [in] */ BSTR strParam,
/* [in] */ IWbemClassObject __RPC_FAR *pObjParam
);
private:
BOOL Initialize(void);
void Uninitialize(void);
BOOL m_bValid;
private:
LONG m_lRefCount;
IWbemLocator* m_pLocator;
IWbemServices* m_pService;
IUnsecuredApartment* m_pUnsecuredApartment;
IUnknown* m_pStubUnkown;
IWbemObjectSink* m_pStubSink;
PFN_CALLBACK m_pCallback;
LPVOID m_pContext;
};
#include "stdafx.h"
#include "BrightnessCtrl.h"
CBrightnessCtrl::CBrightnessCtrl(PFN_CALLBACK pCallback, LPVOID lpContext)
: m_pCallback(pCallback)
, m_pContext(lpContext)
, m_pLocator(NULL)
, m_pService(NULL)
, m_pUnsecuredApartment(NULL)
, m_pStubUnkown(NULL)
, m_pStubSink(NULL)
, m_bValid(FALSE