Monitor.h

Monitor.h

好吧,我只是想向戴尔电子邮件支持人员询问这个简单的是/否问题。他们的网站需要服务代码才能发送电子邮件。然后我尝试了他们的“技术”聊天支持。一些印度人的反应很奇怪,最后回答说他/她没有技术知识,只是给了我电子邮件支持的链接(我已经试过了)。

我有一台戴尔 U2412M 显示器,它有一个 DisplayPort 和一个上行链路 USB 端口。我已在 OSD 中启用了 DDC/CI。我使用的是 Windows 8,Charm Bar 上的亮度控制已禁用。

可以启用它吗?因为我听说 DDC/CI 可让您的计算机控制您的显示器。

DDC/CI(命令接口)标准于 1998 年 8 月推出。它指定了计算机通过双向链路向显示器发送命令以及从显示器接收传感器数据的方法。用于控制显示器的特定命令在单独的显示器控制命令集 (MCCS) 标准版本 1.0 中定义,该版本于 1998 年 9 月发布。DDC/CI 显示器有时配备外部颜色传感器,以便自动校准显示器的颜色平衡。一些倾斜的 DDC/CI 显示器支持自动旋转功能,其中显示器中的旋转传感器使操作系统能够在显示器在纵向和横向位置之间移动时保持显示器直立。大多数 DDC/CI 显示器仅支持一小部分 MCCS 命令,有些显示器有未记录的命令。许多制造商过去并不关注 DDC/CI,但现在几乎所有显示器都支持以下通用 MCCS 命令:亮度和对比度管理。

答案1

请参阅 DDC 页面维基百科

它链接到提供大多数现代显示器的 GUI 和命令行控制的软件。

答案2

我有一台 Dell U2515H,通过 HDMI 连接到 nVidia 卡。

我试过软MCCS运行良好。我可以通过软件调整背光亮度。

这些是该监视器显然支持的控制代码:

New control value
Restore factory defaults
Restore luminance/contrast defaults
Restore color defaults
Luminance
Contrast
Select color preset
Red video gain
Green video gain
Blue video gain
Active control
Input source
Screen orientation
Horizontal frequency
Vertical frequency
Panel sub-pixel layout
Display technology type
Application enable key
Display controller type
Display firmware level
Power mode
Display application
VCP version
Manufacturer specific - 0xE0
Manufacturer specific - 0xE1
Manufacturer specific - 0xE2
Manufacturer specific - 0xF0
Manufacturer specific - 0xF1
Manufacturer specific - 0xF2
Manufacturer specific - 0xFD

我还评估了其他一些工具:

  • 调光器- 不调暗背光。使用伪软件调光。
  • 屏幕亮度- 显然使用 DDC/CI 来控制背光,但已从作者的网站上删除。我还没有尝试从那些不可靠的镜像站点下载它。
  • Redshift – 模仿调光器的样子。

编辑:事实证明,Windows 中有一个易于使用的 API 可用于设置屏幕亮度。以下是一些示例代码:

Monitor.h

#pragma once

#include <physicalmonitorenumerationapi.h>
#include <highlevelmonitorconfigurationapi.h>

#include <vector>

class Monitor
{
public:
    explicit Monitor(PHYSICAL_MONITOR pm);
    ~Monitor();

    bool brightnessSupported() const;

    int minimumBrightness() const;
    int maximumBrightness() const;
    int currentBrightness() const;

    void setCurrentBrightness(int b);
    // Set brightness from 0.0-1.0
    void setCurrentBrightnessFraction(double fraction);

private:
    bool mBrightnessSupported = false;

    int mMinimumBrightness = 0;
    int mMaximumBrightness = 0;
    int mCurrentBrightness = 0;
    PHYSICAL_MONITOR mPhysicalMonitor;
};

std::vector<Monitor> EnumerateMonitors();

Monitor.cpp

#include "stdafx.h"
#include "Monitor.h"

Monitor::Monitor(PHYSICAL_MONITOR pm) : mPhysicalMonitor(pm)
{
    DWORD dwMonitorCapabilities = 0;
    DWORD dwSupportedColorTemperatures = 0;
    BOOL bSuccess = GetMonitorCapabilities(mPhysicalMonitor.hPhysicalMonitor, &dwMonitorCapabilities, &dwSupportedColorTemperatures);

    if (bSuccess)
    {
        if (dwMonitorCapabilities & MC_CAPS_BRIGHTNESS)
        {
            // Get min and max brightness.
            DWORD dwMinimumBrightness = 0;
            DWORD dwMaximumBrightness = 0;
            DWORD dwCurrentBrightness = 0;
            bSuccess = GetMonitorBrightness(mPhysicalMonitor.hPhysicalMonitor, &dwMinimumBrightness, &dwCurrentBrightness, &dwMaximumBrightness);
            if (bSuccess)
            {
                mBrightnessSupported = true;
                mMinimumBrightness = dwMinimumBrightness;
                mMaximumBrightness = dwMaximumBrightness;
            }
        }
    }
}

Monitor::~Monitor()
{
}

bool Monitor::brightnessSupported() const
{
    return mBrightnessSupported;
}

int Monitor::minimumBrightness() const
{
    return mMinimumBrightness;
}

int Monitor::maximumBrightness() const
{
    return mMaximumBrightness;
}

int Monitor::currentBrightness() const
{
    if (!mBrightnessSupported)
        return -1;

    DWORD dwMinimumBrightness = 0;
    DWORD dwMaximumBrightness = 100;
    DWORD dwCurrentBrightness = 0;
    BOOL bSuccess = GetMonitorBrightness(mPhysicalMonitor.hPhysicalMonitor, &dwMinimumBrightness, &dwCurrentBrightness, &dwMaximumBrightness);
    if (bSuccess)
    {
        return dwCurrentBrightness;
    }
    return -1;
}

void Monitor::setCurrentBrightness(int b)
{
    if (!mBrightnessSupported)
        return;

    SetMonitorBrightness(mPhysicalMonitor.hPhysicalMonitor, b);
}

void Monitor::setCurrentBrightnessFraction(double fraction)
{
    if (!mBrightnessSupported)
        return;
    if (mMinimumBrightness >= mMaximumBrightness)
        return;
    setCurrentBrightness((mMaximumBrightness - mMinimumBrightness) * fraction + mMinimumBrightness);
}


BOOL CALLBACK MonitorEnumCallback(_In_ HMONITOR hMonitor, _In_ HDC hdcMonitor, _In_ LPRECT lprcMonitor, _In_ LPARAM dwData)
{
    std::vector<Monitor>* monitors = reinterpret_cast<std::vector<Monitor>*>(dwData);

    // Get the number of physical monitors.
    DWORD cPhysicalMonitors;
    BOOL bSuccess = GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &cPhysicalMonitors);

    LPPHYSICAL_MONITOR pPhysicalMonitors = NULL;
    if (bSuccess)
    {
        // Allocate the array of PHYSICAL_MONITOR structures.
        LPPHYSICAL_MONITOR pPhysicalMonitors = new PHYSICAL_MONITOR[cPhysicalMonitors];

        if (pPhysicalMonitors != NULL)
        {
            // Get the array.
            bSuccess = GetPhysicalMonitorsFromHMONITOR(hMonitor, cPhysicalMonitors, pPhysicalMonitors);

            // Use the monitor handles.
            for (unsigned int i = 0; i < cPhysicalMonitors; ++i)
            {
                monitors->push_back(Monitor(pPhysicalMonitors[i]));
            }
        }
    }
    // Return true to continue enumeration.
    return TRUE;
}

std::vector<Monitor> EnumerateMonitors()
{
    std::vector<Monitor> monitors;
    EnumDisplayMonitors(NULL, NULL, MonitorEnumCallback, reinterpret_cast<LPARAM>(&monitors));
    return monitors;
}

以明显的方式使用。

答案3

可以控制支持 DDC/CI 的显示器的固件设置和配置。

戴尔提供了一款名为戴尔显示管理器,由 EnTech Taiwan 设计,用于其显示器。它主要是一个基于 GUI 的实用程序,但提供了相当全面的命令行功能。当前版本与 Windows Vista - Windows 10 兼容。它可能与其他供应商的显示器兼容,但尚未得到证实。

最新版本的软件可以直接从官方网站


戴尔显示管理器

以下信息摘自该计划关于信息和部分自述文件.txt文件突出显示命令行语法。

关于

Dell Display Manager
版本 1.27.0.1792
版权所有 (c) 2007-2016,EnTech Taiwan。

已授权给戴尔公司。

网站:http://www.entechtaiwan.com
电子邮件:[电子邮件保护]

命令语言

通过命令行支持丰富灵活的命令语言,并且可以组合命令行参数。在适当的情况下,可以通过在命令前面加上显示编号来定位特定显示,例如2:AutoSetup;如果没有指定显示编号,则该命令将应用于当前选定的显示或所有显示(视情况而定)。命令包括:

SetActiveInput [DVI2/HDMI/DP2,etc]-切换活动输入
RestoreFactoryDefaults- 恢复出厂默认设置*
AutoSetup- 执行自动设置(仅限模拟)*
RestoreLevelDefaults- 恢复级别默认值*
RestoreColorDefaults- 恢复颜色默认值*
SetBrightnessLevel X- 将亮度设置为 X% (0-100)*
SetContrastLevel X- 将对比度设置为 X% (0-100)*
SetNamedPreset [Movie/CAL1,etc]- 更改预设模式*
SetPowerMode [on/off]- 设置显示器电源模式*
SetOptimalResolution- 切换到最佳分辨率
SaveProfile [Name]- 将设置保存到命名的配置文件*
RestoreProfile [Name]- 从命名的配置文件恢复设置*
DeleteProfile [Name]- 删除命名的配置文件
SetGridType [X]- 将 Easy Arrange 网格类型更改为 X
Rescan- 重新扫描显示硬件
ForceReset- 重新连接并重新扫描显示硬件
SetControl X Y- 将十六进制控件 X 设置为十六进制值 Y
IncControl X Y- 将控件 X 的值增加 Y
DecControl X Y- 将控件 X 的值减少 Y
Wait X- 暂停 X 毫秒
Exit- 终止程序

其中一些命令需要熟悉 MCCS 标准。例如,在支持该标准的显示器上,将 OSD 语言切换为西班牙语的命令是 SetControl CC 0A;解锁无意中锁定的 OSD SetControl CA 02

指令可以在命令行上组合,并分配给带有可选热键的标准 Windows 快捷方式。例如:

ddm.exe /RestoreLevelDefaults /2:SetContrastLevel 70

将首先恢复所有显示器的默认级别,然后将显示器 #2 的对比度级别设置为 70%。

笔记:如果不是针对特定显示器,则上面列出的标有星号 (*) 的命令适用于所有显示器,以便于对多显示器矩阵的所有成员进行简单而统一的控制。例如,如果在 16 个相同显示器的矩阵上执行,则命令行:

ddm.exe /SetNamedPreset Warm /SetBrightnessLevel 75

会将所有 16 台显示器设置为暖色预设模式,亮度级别为 75%。

答案4

我一直在使用“mControl”程序,它对我来说效果很好 - 我的显示器是戴尔 U2312HM:

mControl 将单个和多个显示器阵列转变为智能可编程设备,可以动态改变方向、节省电力、切换颜色配置文件和调整亮度,无需使用显示器本身上的古老按钮来学习和浏览晦涩的菜单。

要下载此程序,您需要找到页面下半部分的“图形和监视器实用程序”部分http://www.ddc-ci.com/,然后点击该部分底部的“mControl”链接。

相关内容