是否可以在Dell U2412M上启用软件亮度控制


13

好吧,我只是想对Dell电子邮件支持这个简单的问题。他们的网站只需要服务代码即可发送电子邮件。然后,我尝试了他们的“技术”聊天支持。一些印度人奇怪地回答,最后回答说他/她不具备技术知识,只是给了我电子邮件支持的链接(我已经尝试过了)。

我有一台具有DisplayPort和一个上行USB端口的Dell U2412M显示器。我已经在OSD中启用了DDC / CI。我正在使用Windows 8,并且魅力栏上的亮度控件已禁用。

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

DDC / CI(命令接口)标准于1998年8月引入。它指定了一种计算机通过双向链路向监视器发送命令以及从监视器接收传感器数据的方法。1998年9月发布的单独的“监视器控制命令集”(MCCS)标准版本1.0中定义了用于控制监视器的特定命令。DDC/ CI监视器有时随附有外部色彩传感器,以允许自动校准监视器的色彩平衡。某些可倾斜的DDC / CI监视器支持自动旋转功能,其中监视器中的旋转传感器使操作系统能够在监视器在其纵向和横向位置之间移动时使显示器保持竖立状态。大多数DDC / CI监视器仅支持一小部分MCCS命令,而某些监视器具有未记录的命令。亮度和对比度管理。


对于Linux,请查看ddcutil.com
cwd

Answers:



6

我有一个通过HDMI连接到nVidia卡的Dell U2515H。

我尝试了softMCCS,它工作正常。我可以通过该软件调整背光亮度。

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

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

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

  • 调光器 -不暗背光。使用伪造的软件调光。
  • ScreenBright-显然使用DDC / CI来控制背光,但已从作者的网站上删除。我没有尝试从那些狡猾的镜像站点之一下载它。
  • Redshift-像Dimmer一样伪装。

编辑:原来有一个易于使用的API,用于在Windows中设置屏幕亮度。这是一些示例代码:

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;
}

以明显的方式使用。


可以使用softMCCS在DisplayPort上的Philips BDM4065UC上工作,对此感到非常高兴,谢谢!!!!
Avlin '17

4

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

Dell提供了由EnTech Taiwan设计的名为Dell Display Manager的自定义品牌软件,用于其显示器。它主要是基于GUI的实用程序,但提供了相当全面的命令行功能。当前版本与Windows Vista-Windows 10兼容。它可以与其他供应商的显示器一起使用,但尚未确认。

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


戴尔显示管理器

以下信息摘自该程序的“ 关于”信息以及Readme.txt文件突出显示的命令行语法的一部分。

关于

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

授权给Dell Inc.

网站:http
://www.entechtaiwan.com电子邮件:dell.support@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-将控件X的值
IncControl X Y增加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%。


对比度不能低于25%
Nakilon

1

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

mControl将单个和多个监视器阵列变成智能的可编程设备,这些设备可以动态改变方向,节省功率,切换色彩配置文件和调节亮度,从而无需使用显示器本身上的过时按钮来学习和浏览晦涩难懂的菜单。

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


0

我使用此自动热键脚本(受此reddit帖子启发)发送适当的MCCS命令。在Win10下的Dell U2718Q上像超级按钮一样工作:

^!-::
    changeMonitorBrightness(-10)
return

^!=::
    changeMonitorBrightness(10)

getMonitorHandle()
{
  MouseGetPos, xpos, ypos
  point := ( ( xpos ) & 0xFFFFFFFF ) | ( ( ypos ) << 32 )
  ; Initialize Monitor handle
  hMon := DllCall("MonitorFromPoint"
    , "int64", point ; point on monitor
    , "uint", 1) ; flag to return primary monitor on failure

  ; Get Physical Monitor from handle
  VarSetCapacity(Physical_Monitor, 8 + 256, 0)

  DllCall("dxva2\GetPhysicalMonitorsFromHMONITOR"
    , "int", hMon   ; monitor handle
    , "uint", 1   ; monitor array size
    , "int", &Physical_Monitor)   ; point to array with monitor

  return hPhysMon := NumGet(Physical_Monitor)
}

destroyMonitorHandle(handle)
{
  DllCall("dxva2\DestroyPhysicalMonitor", "int", handle)
}


changeMonitorBrightness(delta)
{
  vcpLuminance := 0x10

  handle := getMonitorHandle()

  DllCall("dxva2\GetVCPFeatureAndVCPFeatureReply"
    , "int", handle
    , "char", vcpLuminance
    , "Ptr", 0
    , "uint*", luminance
    , "uint*", maximumValue)

  luminance += delta

  if (luminance > 100) 
  {
  luminance := 100
  }
  else if (luminance < 0)
  {
  luminance := 0
  }

  DllCall("dxva2\SetVCPFeature"
    , "int", handle
    , "char", vcpLuminance
    , "uint", luminance)
  destroyMonitorHandle(handle)
} 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.