我正试图在Windows 10机器上设置亮度。显示器似乎不支持setMonitorBrightness
,而setDeviceGammaRamp
改变了伽马,白点等,所以我尽量不使用它。
我正在尝试使用IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS
控件使其工作。当我使用CreateFile()
获得监视器句柄时,我会检查句柄是否无效,是否正常。但是,当我用ERROR_INVALID_HANDLE
调用DeviceIoControl()
时,会得到IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS
(错误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)
呢?
发布于 2016-09-02 20:22:41
在电话里
DeviceIoControl(h, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS,
(DISPLAY_BRIGHTNESS*)&_displayBrightness, nOutBufferSize, NULL, 0, &ret,
&olp)
&olp
指向未初始化的重叠结构。这个结构有一个事件对象(hEvent)的句柄,它包含一个随机值。这是DeviceIoControl
调用所抱怨的无效句柄。
由于您没有使用CreateFile
标志调用FILE_FLAG_OVERLAPPED
(这对显示设备确实没有任何意义),所以根本不需要传递OVERLAPPED
结构。只要通过NULL
,调用就会成功:
DeviceIoControl(h, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS,
(DISPLAY_BRIGHTNESS*)&_displayBrightness, nOutBufferSize, NULL, 0, &ret,
NULL)
https://stackoverflow.com/questions/39262619
复制相似问题