程序控制笔记本的背光亮度

litomboy 2010-01-05 02:41:48
请教高手如何获得当前的笔记本的背光亮度,程序控制笔记本的背光亮度,高手做过此方面的指点下是否有此类的API函数,我要的不是在当前亮度下调节对比度,而是得到当前的背光亮度,我们的数据是在EC空间内,但是在VISTA和WIN7下,要是得到此值必须以管理员的权限运行,可是不能手动运行。做过此方面的高手指点下,要是写驱动读写数据的话,在VISTA和WIN7下能否越过UAC,因为我们的程序要出货的,说白了就是OSD软件的背光亮度控制程序。
...全文
725 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
迷恋郭德纲 2010-11-26
  • 打赏
  • 举报
回复
5楼这段代码的实例能否共享??
wangk 2010-01-19
  • 打赏
  • 举报
回复
GetMonitorBrightness系列操作需要发控制码给显示设备的驱动,如果设备驱动不回应的话,肯定是得不到正确值的。

这个问题你应该找设备供应商寻求支持,最好可以直接从他们那边拿SDK和Sample。
litomboy 2010-01-19
  • 打赏
  • 举报
回复
CSDN 的高手,冒个泡啊!期待你们的指点!
litomboy 2010-01-14
  • 打赏
  • 举报
回复
谢谢,非常的感谢,我现在找到解决的办法了,现在EC做了控制背光亮度的功能了,也就是说系统能支持这项功能了,可是我现在当前亮度的值还是取不出来,按常规来说 应该能取出来的.下面的API函数 高手有接触到的没?
VISTA系统下提供了一些高层的API可以方便地控制屏幕的亮度、色温、对比度、显示区等。这些API定义在HighLevelMonitorConfigurationAPI.h中,库为dxva2.lib。在对屏幕操作前需要获得其句柄,操作完后要释放。这里分别以GetPhysicalMonitor和FreePhysicalMonitor实现。

void FreePhysicalMonitor(DWORD npm, LPPHYSICAL_MONITOR ppm)
{
DestroyPhysicalMonitors(npm, ppm);
// Free the array.
free(ppm);
}

LPPHYSICAL_MONITOR GetPhysicalMonitor(DWORD *pnpm)
{
HMONITOR hMon = NULL;
hMon = MonitorFromWindow(NULL, MONITOR_DEFAULTTOPRIMARY);
LPPHYSICAL_MONITOR ppm = NULL;
DWORD npm = 0;
BOOL bRet = GetNumberOfPhysicalMonitorsFromHMONITOR(hMon, &npm);
if (bRet) {
ppm = (LPPHYSICAL_MONITOR)malloc(npm * sizeof(PHYSICAL_MONITOR));
if (ppm) {
bRet = GetPhysicalMonitorsFromHMONITOR(hMon, npm, ppm);
if (!bRet) {
FreePhysicalMonitor(npm, ppm);
ppm = NULL;
npm = 0;
}
}
}
*pnpm = npm;
return ppm;
}

返回的是PHYSICAL_MONITOR数组,以下示例只是使用了第一个PHYSICAL_MONITOR元素。

1、调整屏幕前我们可以看看显示器支持什么功能
Vista提供的API是GetMonitorCapabilities(在有些显示器上虽然GetMonitorCapabilities调用失败,但仍然可以调整亮度等;在有些显示器上,从GetMonitorCapabilities返回的值看可以支持某些功能,但实际又不能。这些都另当别论)。

LPPHYSICAL_MONITOR ppm = 0;
ppm = GetPhysicalMonitor();
if (ppm) {
DWORD nmc = 0, nct = 0;
GetMonitorCapabilities(ppm->hPhysicalMonitor, &nmc, &nct);
CString str = _T("");
if (nmc & MC_CAPS_BRIGHTNESS) {
str += _T("Support brightness control\n");
}
if (nmc & MC_CAPS_COLOR_TEMPERATURE) {
str += _T("Support color temperature\n");
}
if (nmc & MC_CAPS_CONTRAST) {
str += _T("Support contrast\n");
}
.........
if (str == _T(""))
str = _T("Support None");
MessageBox(str);
FreePhysicalMonitor(npm, ppm);
}

2、如何调整亮度
LPPHYSICAL_MONITOR ppm = 0;
DWORD npm = 0;
ppm = GetPhysicalMonitor(&npm);
if (ppm) {
DWORD nMin = 0, nCur = 0, nMax = 0;
GetMonitorBrightness(ppm->hPhysicalMonitor, &nMin, &nCur, &nMax);
CString str;
str.Format(_T("Min:%d, Cur:%d, Max:%d"), nMin, nCur, nMax);
MessageBox(str);
SetMonitorBrightness(ppm->hPhysicalMonitor, nMin);
Sleep(1000);
SetMonitorBrightness(ppm->hPhysicalMonitor, nMax);
Sleep(1000);
SetMonitorBrightness(ppm->hPhysicalMonitor, nCur);
Sleep(1000);
FreePhysicalMonitor(npm, ppm);
}

3、调色温

LPPHYSICAL_MONITOR ppm = 0;
DWORD npm = 0;
ppm = GetPhysicalMonitor(&npm);
if (ppm) {
SetMonitorRedGreenOrBlueGain(ppm->hPhysicalMonitor, MC_RED_GAIN, 50);
Sleep(500);
SetMonitorRedGreenOrBlueGain(ppm->hPhysicalMonitor, MC_GREEN_GAIN, 49);
Sleep(500);
SetMonitorRedGreenOrBlueGain(ppm->hPhysicalMonitor, MC_BLUE_GAIN, 52);
MessageBox(_T("Set color temperature => Done"));

FreePhysicalMonitor(npm, ppm);
}

4、调对比度

LPPHYSICAL_MONITOR ppm = 0;
DWORD npm = 0;
ppm = GetPhysicalMonitor(&npm);
if (ppm) {
DWORD nMin, nCur, nMax;
GetMonitorContrast(ppm->hPhysicalMonitor, &nMin, &nCur, &nMax);
CString str;
str.Format(_T("Min:%d, Cur:%d, Max:%d"), nMin, nCur, nMax);
MessageBox(str);
SetMonitorContrast(ppm->hPhysicalMonitor, nMin);
Sleep(1000);
SetMonitorContrast(ppm->hPhysicalMonitor, nMax);
Sleep(1000);
SetMonitorContrast(ppm->hPhysicalMonitor, nCur);
Sleep(1000);
FreePhysicalMonitor(npm, ppm);
}

5、查看显示器类型

LPPHYSICAL_MONITOR ppm = 0;
DWORD npm = 0;
ppm = GetPhysicalMonitor(&npm);
if (ppm) {
TCHAR *descs[] = {
_T("Shadow-mask cathode ray tube (CRT)"),
_T("Aperture-grill CRT"),
_T("Thin-film transistor (TFT) display"),
_T("Liquid crystal on silicon (LCOS) display"),
_T("Plasma display"),
_T("Organic light emitting diode (LED) display"),
_T("Electroluminescent display"),
_T("Microelectromechanical display"),
_T("Field emission device (FED) display")
};
MC_DISPLAY_TECHNOLOGY_TYPE dtt;
GetMonitorTechnologyType(ppm->hPhysicalMonitor, &dtt);
CString str;
str.Format(_T("Technology type: %s"), descs[(int)dtt]);
MessageBox(str);
FreePhysicalMonitor(npm, ppm);
}

6、恢复出厂设置

LPPHYSICAL_MONITOR ppm = 0;
DWORD npm = 0;
ppm = GetPhysicalMonitor(&npm);
if (ppm) {
RestoreMonitorFactoryDefaults(ppm->hPhysicalMonitor);
FreePhysicalMonitor(npm, ppm);
}

oyljerry 2010-01-12
  • 打赏
  • 举报
回复
vista,win7上面加强了安全属性,所以需要Admin权限的程序就需要跳UAC通知用户,你做成驱动,权限是够了,但是你安装驱动等,也是需要admin权限的,否则无法安装成功。
所以最终会过来,你可以把你的exe,嵌入requireAdministrator的manifest,这样用户双击exe的时候,就会自动跳UAC,让用户允许...
litomboy 2010-01-12
  • 打赏
  • 举报
回复
我晕,我都发布了这么长时间了,CSDN的 高手就可怜可怜我吧,我现在找到方法了,可是GetMonitorBrightNess() 不知道为什么得不到值 高手 指点下吧!!!
liulwn 2010-01-05
  • 打赏
  • 举报
回复
估计没硬件的API接口文档做不了。
sandyandy 2010-01-05
  • 打赏
  • 举报
回复
帮顶

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧