无法在Windows 7上获取用于颜色校准的物理监视器句柄
我在Windows7上,我正试图改变代码的颜色平衡。具体来说,我正在尝试更改“颜色校准向导”上显示的颜色。 我假设正确的函数是和 以下是我的最小工作示例:无法在Windows 7上获取用于颜色校准的物理监视器句柄,windows,winapi,Windows,Winapi,我在Windows7上,我正试图改变代码的颜色平衡。具体来说,我正在尝试更改“颜色校准向导”上显示的颜色。 我假设正确的函数是和 以下是我的最小工作示例: #pragma comment(lib, "dxva2.lib") #include <windows.h> #include <lowlevelmonitorconfigurationapi.h> #include <physicalmonitorenumerationapi.h> #
#pragma comment(lib, "dxva2.lib")
#include <windows.h>
#include <lowlevelmonitorconfigurationapi.h>
#include <physicalmonitorenumerationapi.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;
int main()
{
HWND hWnd = GetDesktopWindow();
HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTOPRIMARY);
cout << "Monitor: " << hMonitor << endl;
DWORD cPhysicalMonitors;
BOOL bSuccess = GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &cPhysicalMonitors);
cout << "GetNumber: " << bSuccess << ", number of physical monitors: " << cPhysicalMonitors << endl;
LPPHYSICAL_MONITOR pPhysicalMonitors = (LPPHYSICAL_MONITOR)malloc(cPhysicalMonitors * sizeof(PHYSICAL_MONITOR));
bSuccess = GetPhysicalMonitorsFromHMONITOR(hMonitor, cPhysicalMonitors, pPhysicalMonitors);
cout << "GetPhysicalMonitor: " << bSuccess << endl
<< "Handle: " << pPhysicalMonitors[0].hPhysicalMonitor << endl
<< "Description: ";
wcout << (WCHAR*)(pPhysicalMonitors[0].szPhysicalMonitorDescription);
DestroyPhysicalMonitors(cPhysicalMonitors, pPhysicalMonitors);
free(pPhysicalMonitors);
}
亮度和颜色增益的所有功能都需要HANDLE HPPhysicalMonitor
,对于我的显示器(笔记本电脑屏幕),它总是null
。但是,我知道必须可以更改颜色平衡,因为颜色校准窗口可以做到这一点
我做错了什么
编辑1:
如评论中所述,HPPhysicalMonitor
似乎是正确的。我的问题是调用函数如GetMonitorBrightness
返回FALSE
,错误代码为error\u GRAPHICS\u I2C\u error\u transmisting\u DATA
(在I2C总线上向设备传输数据时出错)
编辑2:
我的显示器支持设置亮度,有11个级别。Windows本身和一些程序能够调节亮度(直接调节显示器的背光)。因此,这个问题一定与软件有关
我的问题是调用GetMonitorBrightness之类的函数会返回
FALSE,错误代码为错误图形错误I2C错误传输错误数据
(向I2C上的设备传输数据时出错
公共汽车。)
GetMonitorBrightness
适合我。我在IE桌面上测试了它。一些类似的案例指出,GetMonitorBrightness
在某些笔记本电脑上不起作用
GetMonitorBrightness
适合我。我在IE桌面上测试了它。一些类似的案例指出,GetMonitorBrightness
在某些笔记本电脑上不起作用
您可以先检查您的笔记本电脑是否支持DDC/Cl。我在Windows 10上也有相同的行为(有2个监视器,每个监视器1个物理监视器)。什么使您认为NULL(0)是无效的“句柄”?当我调用GetMonitorCapabilities(0,…)时,需要花费一些时间并返回TRUE,当我使用伪句柄时,它返回FALSE和GetLastError()=>ERROR\u GRAPHICS\u INVALID\u PHYSICAL\u MONITOR\u handle。@SimonMourier我假设是这样,因为例如GetMonitorBrightness返回FALSE。既然您已经提到了它,我检查了GetMonitorBrightness之后的最后一个错误,它是
错误\u图形\u I2C\u错误\u传输数据
(在I2C总线上向设备传输数据时出错)。我将更新这个问题…我在Windows 10上有相同的行为(有2个监视器,每个监视器1个物理监视器)。什么使您认为NULL(0)是无效的“句柄”?当我调用GetMonitorCapabilities(0,…)时,需要花费一些时间并返回TRUE,当我使用伪句柄时,它返回FALSE和GetLastError()=>ERROR\u GRAPHICS\u INVALID\u PHYSICAL\u MONITOR\u handle。@SimonMourier我假设是这样,因为例如GetMonitorBrightness返回FALSE。既然您已经提到了它,我检查了GetMonitorBrightness之后的最后一个错误,它是错误\u图形\u I2C\u错误\u传输数据
(在I2C总线上向设备传输数据时出错)。我将更新问题…如果我的显示器不支持DDC/CI,Windows如何更改亮度和RGB增益?其他程序也能改变它们。那么,如果winapi中没有这个函数,那么如何实现呢?我对这些程序进行了快速调试,发现它们从dxva2库导入了函数GetNumberOfPhysicalMonitors fromMonitor
和Set/GetMonitorBrightness
。(请注意,我的显示器是HP 15 r215nk笔记本电脑中的显示器。)@RationalFragileSetMonitorBrightness
允许您更改外部显示器的亮度,请参阅此。相反,您可以使用来实现。可能对您有用。如果我的显示器不支持DDC/CI,Windows如何更改亮度和RGB增益?其他程序也能改变它们。那么,如果winapi中没有这个函数,那么如何实现呢?我对这些程序进行了快速调试,发现它们从dxva2库导入了函数GetNumberOfPhysicalMonitors fromMonitor
和Set/GetMonitorBrightness
。(请注意,我的显示器是HP 15 r215nk笔记本电脑中的显示器。)@RationalFragileSetMonitorBrightness
允许您更改外部显示器的亮度,请参阅此。相反,您可以使用来实现。也许对你有用。
Monitor: 00010001
GetNumber: 1, number of physical monitors: 1
GetPhysicalMonitor: 1
Handle: 00000000
Description: Generic PnP Monitor