【问题标题】:Setting brightness on Windows 10 using C++ WinAPI使用 C++ WinAPI 在 Windows 10 上设置亮度
【发布时间】:2017-01-08 19:29:25
【问题描述】:

我正在尝试在 Windows 10 机器上设置亮度。显示器似乎不支持setMonitorBrightness,而setDeviceGammaRamp 会改变gamma、白点等,所以我尽量不要使用它。

我正在尝试使用IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS 控件使其工作。当我使用CreateFile() 获取监视器句柄时,我检查句柄是否无效并且没问题。但是当我用IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS 调用DeviceIoControl() 时,我得到ERROR_INVALID_HANDLE(错误6)。

typedef struct _DISPLAY_BRIGHTNESS {  
   UCHAR ucDisplayPolicy;  
   UCHAR ucACBrightness;  
   UCHAR ucDCBrightness;  
} DISPLAY_BRIGHTNESS, *PDISPLAY_BRIGHTNESS; 

DISPLAY_BRIGHTNESS _displayBrightness;

_displayBrightness.ucDisplayPolicy = 0;
_displayBrightness.ucACBrightness = 0;  //for testing purposes
_displayBrightness.ucDCBrightness = 0;

DWORD ret = NULL;
OVERLAPPED olp;

DWORD nOutBufferSize = sizeof(_displayBrightness);
HANDLE h = CreateFile(L"\\\\.\\LCD",
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    0, NULL);

if (h == INVALID_HANDLE_VALUE) {
    //Does not reach here
    return false;
}  

if (!DeviceIoControl(h, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS, (DISPLAY_BRIGHTNESS *)&_displayBrightness, nOutBufferSize, NULL, 0, &ret, &olp))
{
    // GetLastError() returns error code 6 - Invalid handle 
    return false;
} 

另外,我应该使用CreateFile() 来获取监视器句柄,还是可以调用MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY) 来代替?

【问题讨论】:

  • &olp 是指向未初始化的OVERLAPPED 结构的指针,该结构具有指向事件对象的句柄。我认为这是DeviceIoControl 抱怨的无效句柄。无论如何,您都不需要传递OVERLAPPED 结构,因此只需传递NULL
  • 这正是问题所在。非常感谢!

标签: c++ windows winapi monitor


【解决方案1】:

通话中

DeviceIoControl(h, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS,
                (DISPLAY_BRIGHTNESS*)&_displayBrightness, nOutBufferSize, NULL, 0, &ret,
                &olp)

&olp 指向一个未初始化的OVERLAPPED 结构。这个结构有一个事件对象 (hEvent) 的句柄,它包含一个随机值。这是DeviceIoControl 调用抱怨的无效句柄。

由于您没有使用FILE_FLAG_OVERLAPPED 标志调用CreateFile(这对于显示设备来说确实没有意义),因此您根本不需要传递OVERLAPPED 结构。只需传递NULL,调用就会成功:

DeviceIoControl(h, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS,
                (DISPLAY_BRIGHTNESS*)&_displayBrightness, nOutBufferSize, NULL, 0, &ret,
                NULL)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2016-05-21
    相关资源
    最近更新 更多