Tôi có Dell U2515H được kết nối qua HDMI với thẻ nVidia.
Tôi đã thử softMCCS và nó hoạt động tốt. Tôi đã có thể điều chỉnh độ sáng của đèn nền từ phần mềm.
Đây là các mã điều khiển mà màn hình này hỗ trợ rõ ràng:
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
Tôi cũng đã đánh giá một vài công cụ khác:
- Dimmer - Không làm mờ đèn nền. Sử dụng phần mềm giả mờ.
- ScreenBright - Rõ ràng sử dụng DDC / CI để kiểm soát đèn nền, nhưng đã bị xóa khỏi trang web của tác giả. Tôi đã không thử tải nó xuống từ một trong những trang nhân bản tinh ranh đó.
- Redshift - Làm cho nó giống như Dimmer.
Chỉnh sửa: Hóa ra có một API dễ sử dụng để cài đặt độ sáng màn hình trong Windows. Dưới đây là một số mã ví dụ:
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;
}
Sử dụng một cách rõ ràng.