社区导航

 

搜索
查看: 3443|回复: 13

背光亮度调整时,写注册表失败

[复制链接]

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-8 21:10 | 显示全部楼层 |阅读模式
我在调整背光的亮度,写了几个函数,一个是读注册表,一个是写注册表,一个是设置背光亮度,
读注册表的程序如下:

  1. LONG        regStatus;
  2.         DWORD        valLen;
  3.         DWORD        valType;
  4.         HKEY        hregBL;
  5.        
  6.         regStatus = RegOpenKeyEx(HKEY_CURRENT_USER, RK_CONTROLPANEL_BACKLIGHT,0, 0, &hregBL);
  7.         if (regStatus!=ERROR_SUCCESS)
  8.         {
  9.        RETAILMSG(1,(TEXT("Backlight:RegOpenKeyEx(HLM\\%s) failed!!\r\n"),RK_CONTROLPANEL_BACKLIGHT));
  10.        //return regStatus;
  11.   }
  12.   valLen = sizeof(DWORD);
  13.         regStatus = RegQueryValueEx(hregBL, TEXT("Brightness"), NULL,&valType, (PBYTE)&pBrightness, &valLen);
  14.         RETAILMSG(1,(TEXT("pBrightness=0x%x\r\n"),pBrightness));
  15.                        
  16.         if (regStatus!=ERROR_SUCCESS)
  17.         {       
  18.                 pBrightness = 0xa;
  19.         }
  20.         RETAILMSG(1,(TEXT("pBrightness1=0x%x\r\n"),pBrightness));
  21.         RegCloseKey(hregBL);
复制代码

写注册表的程度如下:

  1. void SetBacklightRegs(void)
  2. {
  3.          LONG        regStatus;
  4.          HKEY        hregBL;
  5.          
  6.          regStatus = RegOpenKeyEx(HKEY_CURRENT_USER, RK_CONTROLPANEL_BACKLIGHT, 0, 0, &hregBL);
  7.          if (regStatus!=ERROR_SUCCESS)
  8.          {
  9.       RETAILMSG(1,(TEXT("Backlight:RegOpenKeyEx(HLM\\%s) failed!!\r\n"),RK_CONTROLPANEL_BACKLIGHT));
  10.       //return regStatus;
  11.    }
  12.          RegSetValueEx(hregBL,TEXT("Brightness"),0,REG_DWORD,(const BYTE *)&pBrightness,sizeof(DWORD));                                            
  13.    RegCloseKey(hregBL);  
  14. }
复制代码

设置背光时,我是先通过读注册表读出pBrightness的值,然后改变,然后再写回去。写的时候就会出错,系统会直接halt,如果不写回去,就不会出错,但是由于每次设置都是先读出来,所以如果不写回去的话,每次读出来的都还是默认值,背光只能改变一次。
请大家帮忙看一下,我写回去的代码有问题吗?
非常感谢!

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 11:04 | 显示全部楼层
向大家致以最诚挚的谢意,确实是那个const的问题。
结贴。

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 08:27 | 显示全部楼层
背光设置,应该采用DeviceIoControl()来操作背光设备,而不是简单的修改注册表。而且也不用存贮当前值,使用的时候,再调用DeviceIoControl()来获得当前值。

难道修改了注册表,背光就会随着变化吗?

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 09:00 | 显示全部楼层
up

回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 09:16 | 显示全部楼层
引用 3 楼 91program 的回复:
背光设置,应该采用DeviceIoControl()来操作背光设备,而不是简单的修改注册表。而且也不用存贮当前值,使用的时候,再调用DeviceIoControl()来获得当前值。

难道修改了注册表,背光就会随着变化吗?

一般的背光驱动里面会把背光的当前值写到注册表里保存,而提供给AP操作的一般是IOControl接口

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 09:40 | 显示全部楼层
学习

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 10:10 | 显示全部楼层
RegSetValueEx(hregBL,TEXT("Brightness"),0,REG_DWORD,(const BYTE *)&pBrightness,sizeof(DWORD));

lz把const拿掉试试!

回复

使用道具 举报

1

TA的帖子

0

TA的资源

禁止访问

发表于 2009-1-8 21:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-8 23:04 | 显示全部楼层
你的pBrightness定义在哪里?     
RegSetValueEx(hregBL,TEXT("Brightness"),0,REG_DWORD,(const BYTE *)&pBrightness,sizeof(DWORD));把const去掉看看
你们BSP里没有现成的注册表读写函数吗?直接拿过来修改一下使用不会有问题的

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 08:47 | 显示全部楼层
楼主是送一些值给背光驱动的吧。
————————————————————
在控制面板的程序改变都是修改注册表的?

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 09:00 | 显示全部楼层
up

回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 09:10 | 显示全部楼层
regStatus = RegOpenKeyEx(HKEY_CURRENT_USER, RK_CONTROLPANEL_BACKLIGHT, 0, 0, &hregBL);
倒数第二个参数不应该是0吧

楼主读写注册表只是得到系统当前保存的背光灯的亮度值及修改后的值,
他改变亮度应该是用到了DeviceIoControl()



回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 10:13 | 显示全部楼层
谢谢大家,我是使用了DeviceIOControl,我再把我的执行流程说一遍,请大家帮忙检查一下:
1、背光驱动中设置IOControl,定义一个#define IOCTL_BACKLIGHT_CONTROL 0x10
2、在case IOCTL_BACKLIGHT_CONTROL下,程序如下:

  1.    if(*lpInBuf==1)
  2.          SetBacklightStatus(TRUE);
  3.    else
  4.          SetBacklightStatus(FALSE);
复制代码

3、上述设置是在MDD下做的,现在在PDD中ms2_backlight.cpp中,添加一楼所说的注册表读取和写入的函数,和设置背光值的函数,pBrightness也是在这里定义的。通过读注册表,可以读出pBrightness的值,然后通过SetBacklightStatus函数,即TRUE,则pBrightness+1,FALSE则pBrightness-1。然后将改变后的值写回注册表。顺便说一句,得到pBrightness的值后,我会有一个SetPWM函数来通过pBrightness改变当前背光的状态,背光是通过改变PWM而改变的。
4、在外部驱动调用IOControl,我是在键盘驱动中调用的,类似于我们的笔记本,键盘上有两个键,一个是增加背光,一个是减少背光,调用方式如下:

  1.                                        BYTE state = 0;
  2.                                           if ((blHandleMon = CreateFile(L"BKL1:", GENERIC_READ | GENERIC_WRITE,
  3.                                                              FILE_SHARE_READ | FILE_SHARE_WRITE,
  4.                                                              NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE)
  5.                               {
  6.                                          RETAILMSG(1, (TEXT("PwrButtonIntrThread: backlight driver not found.  Error %d\r\n"),
  7.                                                      GetLastError()));
  8.                               }
  9.                
  10.                                     DeviceIoControl(blHandleMon,0x10,&state,sizeof(BYTE),NULL,0,NULL,NULL);
  11.                                                             RETAILMSG(1, (TEXT("Keyboard: Backlight++\r\n")));
  12.                                                             CloseHandle(blHandleMon);
复制代码

这就是我的整个设计流程,请大家在帮忙看看。
另外,我的背光驱动中有一个void BacklightRegChanged()函数,但是这个函数是空的,并没有实现。
谢谢!

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-1-9 11:02 | 显示全部楼层
背光灯不是那么实现的,DEVICEIOCONTROL,去控件IO口应该还靠谱。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-1-24 16:10 , Processed in 0.412952 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表