gpt4 book ai didi

c++ - 使用 C++ WinAPI 在 Windows 10 上设置亮度

转载 作者:可可西里 更新时间:2023-11-01 10:33:42 26 4
gpt4 key购买 nike

我正在尝试在 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)

最佳答案

通话中

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)

关于c++ - 使用 C++ WinAPI 在 Windows 10 上设置亮度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39262619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com