【发布时间】: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