无法在Windows 7上获取用于颜色校准的物理监视器句柄

无法在Windows 7上获取用于颜色校准的物理监视器句柄,windows,winapi,Windows,Winapi,我在Windows7上,我正试图改变代码的颜色平衡。具体来说,我正在尝试更改“颜色校准向导”上显示的颜色。 我假设正确的函数是和 以下是我的最小工作示例: #pragma comment(lib, "dxva2.lib") #include <windows.h> #include <lowlevelmonitorconfigurationapi.h> #include <physicalmonitorenumerationapi.h> #

我在Windows7上,我正试图改变代码的颜色平衡。具体来说,我正在尝试更改“颜色校准向导”上显示的颜色。 我假设正确的函数是和

以下是我的最小工作示例:

#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
在某些笔记本电脑上不起作用

我认为您的笔记本电脑不支持DDC/CI

:如果监视器未启动,则功能失败 支持DDC/CI

您可以先检查您的笔记本电脑是否支持DDC/Cl

我的问题是调用GetMonitorBrightness之类的函数会返回 FALSE,错误代码为错误图形错误I2C错误传输错误数据 (向I2C上的设备传输数据时出错 公共汽车。)

GetMonitorBrightness
适合我。我在IE桌面上测试了它。一些类似的案例指出,
GetMonitorBrightness
在某些笔记本电脑上不起作用

我认为您的笔记本电脑不支持DDC/CI

:如果监视器未启动,则功能失败 支持DDC/CI


您可以先检查您的笔记本电脑是否支持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笔记本电脑中的显示器。)@RationalFragile
SetMonitorBrightness
允许您更改外部显示器的亮度,请参阅此。相反,您可以使用来实现。可能对您有用。如果我的显示器不支持DDC/CI,Windows如何更改亮度和RGB增益?其他程序也能改变它们。那么,如果winapi中没有这个函数,那么如何实现呢?我对这些程序进行了快速调试,发现它们从dxva2库导入了函数
GetNumberOfPhysicalMonitors fromMonitor
Set/GetMonitorBrightness
。(请注意,我的显示器是HP 15 r215nk笔记本电脑中的显示器。)@RationalFragile
SetMonitorBrightness
允许您更改外部显示器的亮度,请参阅此。相反,您可以使用来实现。也许对你有用。
Monitor: 00010001
GetNumber: 1, number of physical monitors: 1
GetPhysicalMonitor: 1
Handle: 00000000
Description: Generic PnP Monitor