使用IOCTL代码实现LCD背光调节

摘要:
在中国找不到此代码。因此,参考相关代码后,以下代码是完整的,实现方法是通过IOCTL代码实现LCD背光调节功能。适用于平板电脑或笔记本电脑。这主要取决于BIOS是否支持它。

国内这种代码找不到。于是參考了相关代码后完好例如以下代码,且实现方式通过IOCTL代码实现LCD背光调节的功能。

适合场合为平板电脑或者笔记本。主要还是要靠BIOS支持与否。

编译环境使用:Dev-cpp工具编写。


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ddk/Ntddvdeo.h>

typedef struct _DISPLAY_BRIGHTNESS {
    UCHAR ucDisplayPolicy;
    UCHAR ucACBrightness;
    UCHAR ucDCBrightness;
} DISPLAY_BRIGHTNESS, *PDISPLAY_BRIGHTNESS;

#define IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS  CTL_CODE(FILE_DEVICE_VIDEO, 0x125, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS 	CTL_CODE(FILE_DEVICE_VIDEO, 0x126, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS 		CTL_CODE(FILE_DEVICE_VIDEO, 0x127, METHOD_BUFFERED, FILE_ANY_ACCESS)

void help(void)
{
	fprintf(stderr, "(c) Tody, 2014
");
	fprintf(stderr, "Usage: wbl.exe -b <level>
");
	fprintf(stderr, "  Option:
");
	fprintf(stderr, "     -b <level>	 brightness level need to be specified
");
	fprintf(stderr, "
  Error code:
");
	fprintf(stderr, "     Pass: 0;  Fail: 1
");
	
	exit(1);
}

int setBrightness(int level)
{
	HANDLE h ;
	DWORD nOutBufferSize = 256;
	BYTE SupportedBrightness[256];
	DWORD g_supportedLevelCount; 
	DISPLAY_BRIGHTNESS DisplayBrightness;
	
	memset(SupportedBrightness, 0, sizeof(SupportedBrightness));
	
	/* use createfile function to open lcd.  
	* url from microsoft about IOCTL code.
	*  http://msdn.microsoft.com/en-us/library/windows/desktop/aa372703%28v=vs.85%29.aspx
	*/
	h = CreateFile("\\.\LCD", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
	if(h == INVALID_HANDLE_VALUE){
		printf("Open \\.\LCD error");
		exit(1);
	}

	/* Query for display supported level */
	if(!DeviceIoControl(h, IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS, NULL, 0, SupportedBrightness, nOutBufferSize, &g_supportedLevelCount, NULL)){
		printf("IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS error - %d, - buffer: %d ", g_supportedLevelCount, nOutBufferSize);
		exit(1);		
	}
	if (g_supportedLevelCount == 0)  	/* 0 means not supported */
	{
		printf("
LCD not support LEVEL COUNT", g_supportedLevelCount);
		exit(1);
	}

	DisplayBrightness.ucDisplayPolicy = 0;
	DisplayBrightness.ucACBrightness = level;
	DisplayBrightness.ucDCBrightness = level;

	/* Set display backlight level */
	nOutBufferSize = sizeof(DisplayBrightness);
	if(!DeviceIoControl(h, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS, (DISPLAY_BRIGHTNESS *)&DisplayBrightness, nOutBufferSize, NULL, 0, &nOutBufferSize, NULL)){
		printf("IOCTL_VIDEO_SET_SUPPORTED_BRIGHTNESS error - %d, - buffer: %d ", g_supportedLevelCount, nOutBufferSize);
		exit(1);		
	}
	
	Sleep(500); /* delay for some time while wmi event changed */
	nOutBufferSize = sizeof(DisplayBrightness);
	if(!DeviceIoControl(h, IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS, NULL, 0, (DISPLAY_BRIGHTNESS *)&DisplayBrightness, nOutBufferSize, &nOutBufferSize, NULL)){
		printf("IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS error - %d, - buffer: %d ", g_supportedLevelCount, nOutBufferSize);
		exit(1);		
	}
	printf("
Brightness_AC: %d
Brightness_DC: %d", DisplayBrightness.ucACBrightness, DisplayBrightness.ucDCBrightness);		
}


int main(int argc, char *argv[]) {
	/* program with arguments support */
	if (argc == 3 && strcmp("-b", argv[1])==0){
		setBrightness(atoi(argv[2]));
	}else{
		help();
	}

	return 0;
}


免责声明:文章转载自《使用IOCTL代码实现LCD背光调节》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Flatbuffers学习java日期的运用(DateUtils工具类)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CSS对各个浏览器兼容技巧HACK技巧

*   ie6和ie7都可以识别_   只有ie6可以识别\0  只有ie8可以识别:root 只有ie9可以识别  关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是.以下内容没有太多新颖, 纯属个人总结, 希望能对初学者有一定的帮助. 一、CSS HACK HACK概念: 不同的浏览器,比如Internet Explorer 6,...

ESP32开发(2)esp32-cam采集图像

ESP32-CAM摄像头开发板 USB转串口下载器 杜邦连接线若干        注意:GPIO0连接GND(下拉)的作用是让ESP32-CAM进入下载启动模式,这个模式里,才能利用Arduino IDE给ESP32编程,否则IDE会报错,代码烧录完成后,我们需要断开GPIO0和GND的连接,让ESP32进入正常的内存启动模式。 配置ESP32环...

H5+js调用相机

在机缘巧合之下,了解到用HTML5和javascript调用摄像头来实现拍照功能,今天就把大致原理写下来。页面布局很简单,就是一个input标签,两个HTML5元素video、canvas和一个button按钮。video元素带有开启视频功能的函数,canvas元素带有捕捉图像功能的函数。 源代码如下: <!doctype html><h...

echarts vue 甘特图实现

<{extends file="../main.tpl" }> <{block name="html_header_title" append}> <title>厂家机型故障分析</title> <{/block}> <{block name="html_header_css" appe...

android编译系统的makefile文件Android.mk写法

(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件,即要编译的文件。由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$(call my-dir) 上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径。 (2)Android.mk中可以定义多个编...

怒肝半月!Python 学习路线+资源大汇总

Python 学习路线 by 鱼皮。 原创不易,请勿抄袭,违者必究! 大家好,我是鱼皮,肝了十天左右的 Python 学习路线终于来了~ 和之前一样,在看路线前,建议大家先通过以下视频了解几个问题: Python 为什么这么火? 为什么都在说学 Python 找不到工作?Python 真香么? 我要学 Python 么? 怎么快速学习? 视频地址:...