2009年5月2日星期六

51wince非官方Blog

51wince非官方Blog
本部落格已经转移至www.51wince.com
欢迎大家访问。
51wince是一个非官方wince知识库。

51WinCE歡迎各位提供新建議以及資訊!

51WinCE一堆叫做Android的機器人趁管理員沒注意,混進來了。。。。囧。。。。

我们的理念,打造一个精致的,高容量的WinCE知识库!

我们的目标,打造一个细致的,优雅的WinCE知识会所!

管理員很無奈的說,就讓那幫機器人混進來吧。其實我也很囧。

站長:阿肆@Mercury

入住专家:

Norains(专长:WinCE系统定制,Dirver底层开发,Direct开发)

Hellogv(专长:WinCE应用层开发,Win32开发,基于WinCE的J2ME开发)

成吉(专长:硬件平台设计与开发,原理图,pcb绘制)

Gooogleman(专长 ,ARM 开发,汇编开发,Bootloader开发)

如有撰写专栏意向请联系站长:xumercury#gmail.com(#请修改为@)

2008年9月7日星期日

BUILD: [00:0000000004:ERRORI] Bad database entry: 複製 -xxxx.x解决办法

Build時出現這個error
BUILD: [00:0000000004:ERRORI] Bad database entry: 複製 -bsp_cfg.h 44 0 1C83BA26E388E00.
把 platform 下的build.dat刪掉後就OK了。

這個error出現的原因是 platform builder 很好心的幫你紀錄每一個foler的檔案內容(不管他有沒有列在 sources 中)。
同時 nmake 有沒有處理檔名中的"空白",所以一旦folder中有檔案(不管有沒有用到)的檔名包含空白,他就會掛掉.....

像上面的error message,就是我有一個file 叫"複製 -bsp_cfg.h"。
而windows中複製一個file到自己的folder,就會自訂在前面加上"複製"和一個space....


所以解決的方法就是找到error 顯示的那個file,刪掉後,開啟release directory, command console。
將 build.* 刪除後,手動下 build -c 重新build一次。

2008年9月1日星期一

《Windows CE实用开发技术》电子档

请大家限制流量下载。。。流量太大了我的空间会被关闭。。。关闭了就无法下载了。。。切记!!!!

下载!

2008年8月20日星期三

【转】几个可以让博客(圈子)人气急升的方法

玩了163BLOG几个月.

由本来的一个人都没来现在一天来几百.

多多少少有点心得.

整天有人问我我干嘛那么高人气.

我也不卖关子了.

说几条可以让自己BK人气急升的方法:

人际篇:

1.拉帮结派篇

尽量快的时间内去别人BLOG踩点.结交认识些和自己志同道合聊得来的朋友.然后强逼别人到你BLOG上留言

2.流氓篇

谁进你的BK不留言就到他那强逼他回来留言聊天.逼着逼着人家就习惯了``不上你那就不舒服了.

以上两点都是某人增加人气的方法```是谁我就不说了``哈哈

3.冒名顶替

把网上的美女帅哥相片帖去你自己BLOG上.然后说你就是那个人.那肯定色狼就会登门而上.

4.广告篇

到多人的圈子里狂刷讨论区.让地球人都知道你的存在.或在讨论区里面发一张帖`然后回复1-200张回复.那么你的帖子就会出现在163圈子首页.那么你的连接就出现在圈子首页了

5.色BLOG篇

把自己BK弄成SEX网站``加晒D咸湿图片上去.让色狼都上你那看.注意:只要把照片名字写成人体艺术.哪都不会封你BK```当然``不推荐这样做

6.经营篇

自己开一个圈子.经营好一点``那么BLOG友就会常常来看你的了

搜索篇:

BLOG的标签全加热点搜索的标签.转帖几篇比较多人找的文章.然后让搜索引擎收录你的BK.那么搜索来的人气也会增加.

说了这么多,怎么将你的博客提交给搜索引擎啊?下面提供你们一些搜索引擎的提交地址:
有道搜索:http://tellbot.yodao.com/report?type=web
百度:http://www.baidu.com/search/url_submit.html
GOOGLE:http://www.google.com/intl/zh-CN/add_url.html
搜狗:http://db.sohu.com/regurl/regform.asp
TOM:http://search.tom.com/tools/weblog/log.php
中搜:http://d.zhongsou.com/NetSearch/pageurlrecord/frontpageurl.jsp
爱问:http://www.iask.com/guest/add_url.php
一搜: http://www.yisou.com/search_submit.html?source=yisou_www_hp
ALEXA:http://pages.alexa.com/help/webmasters/index.html#crawl_site
有道博客搜索:http://tellbot.yodao.com/report?type=BLOG
百度博客搜索:http://utility.baidu.com/blogsearch/submit.php
GOOGLE BLOGSearch:http://blogsearch.google.com/ping?hl=zh-CN
  以上搜索基本包含了比较有名的搜索,但根据本人的经验,一般访问的人都是通过百度、google搜索到你的博客的,小强提醒而已。下面就赶紧行动吧,让你的博客装上引擎吧!

网站篇:

找专门收录博客的网站.让他们收录你的博客.为你带来人气

收录网站:

http://www.blogall.com.cn/

http://www.souyo.com/

http://so.blogchinese.com/

http://blog.lalec.com/index.asp

http://www.blogrank.cn/submit.asp

集成篇:

1.博客中的文章要精彩。
2.博客标题要新颖。
3.背景要丰富。
4.音乐要优美。
5.要多引导一些人去你的博客参观,然后让他们再引导别人来参观。

软件篇:

软件分为自己的人气和别人给自己的人气.

自己给自己作的人气``很简单``自己开刷.

自己开刷也不是那么简单的事情.别以为1秒开100个网页人家的确会给你一百个浏览量.绝不.

我现今找到的有效刷网工具只有一个了.

下载地址:http://www.rt-520.cn/bbs/thread-5824-1-4.html

另一个软件是别人给你的人气.

自己登录博客后,浏览别人的博客就会留下自己的头像,呵呵,而该博客的主人或来访问这个博客的客人,看到您精心设计的头像,就会回访您的博客,于是 人气因此而涨涨涨……使用《网易博客漫游专家标准版》软件,轻松漫游千万网易博客,只要有1/100的回访率,您的人气就高达10万以上,而这都是软件在 自动行动……您只需要充实您的博客,展示您最精彩的一页……想拥有一个超高人气的博客吗?那么还等什么,下载软件

http://hao500.net/download9/92464.htm

以上两点方法``第一个不推荐.第二个要是你想猛增人气的.可以购买正式版

至于你怎么选择``由你而定了``

2008年8月15日星期五

wince5.0系统时间、音量及背光、触摸屏校正以及进程查看大集合

参考了Norains写的一些东西。然后参考了网上一些大侠们写的东西。总结了一个比较零碎的东西。整个程序由三部分。进程查看器,系统时间修改器,音量及背光修改器。
进程查看器主要是查看当前运行的EXE文件。
同时有触摸校验按钮进入系统触摸屏校验界面。
系统时间修改按钮导出系统时间修改器
音量修改按钮导出音量修改,背光修改界面。
=====================================================================
进程查看可以参考付林林写的东西。不过我现在还是不知道如何产看EXE所调用了的DLL。这个还得研究。
=====================================================================
先介绍如何调用WINCE5.0系统的触摸校验
1.引用
#include
pwinuser.h主要是这个文件。每个人路进不一样可能位置不一样。只要找到这个文件的位置引用就好了
2. TouchCalibrate();//在按钮里调用这个函数。触摸矫正就出来了。。。汗。。很简单。
======================================================================
再次是介绍如何调用外部EXE。
1.这个使用的原因是因为音量控制,时间控制我都做成外部的小程序模块,发现一个很严重的问题就是如果做成子窗体的话如果修改音量还好,修改时间会报系统内存溢出之类的致命错误。所以还是做了外部小程序。
2.用的函数如下:
CreateProcess( szMapPath, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL )
这里要重点说一下。。。。
http://msdn.microsoft.com/en-us/library/ms682425.aspx这个是对的。但是参考范围是2000,XP系统。MSDN上的例子不是WINCE下的。第二个参数是路径,而WINCE下的是第一个参数是路进。这个地方以前研究了很久才发现。这个地方一定要小心
szMapPath这个是你的外部程序路径了。
还有。。。wince下的路径都是用“\\”的哦。。。。
=====================================================================
接下来是系统时间修改器
1.一共六个输入控件,年月日时分秒。
2.6个微调控件,Spin控件
3.初始化的时候定好初始设定和微调设定:
//设置 年 微调按钮
CSpinButtonCtrl *pYEAR = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);

ASSERT(pYEAR!=NULL);
//设置伙伴窗口
//int str=2007;

pYEAR->SetBuddy(GetDlgItem(IDC_YEAR));

pYEAR->SetRange(2008,2099);

pYEAR->SetPos(2008);

m_CYear.SetWindowText(_T("2008"));


//设置 月 微调按钮
CSpinButtonCtrl *pMONTH = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN2);

ASSERT(pMONTH!=NULL);

//设置伙伴窗口

pMONTH->SetBuddy(GetDlgItem(IDC_MONTH));

pMONTH->SetRange(1,12);

pMONTH->SetPos(1);

m_CMonth.SetWindowText(_T("8"));


//设置 日 微调按钮
CSpinButtonCtrl *pDAY = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN3);

ASSERT(pDAY!=NULL);
//设置伙伴窗口
pDAY->SetBuddy(GetDlgItem(IDC_DAY));

pDAY->SetRange(1,31);

pDAY->SetPos(1);

m_CDay.SetWindowText(_T("8"));

//设置 小时 微调按钮
CSpinButtonCtrl *pHOUR = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN4);

ASSERT(pHOUR!=NULL);
//设置伙伴窗口
//int str=2007;
pHOUR->SetBuddy(GetDlgItem(IDC_HOUR));

pHOUR->SetRange(0,23);

pHOUR->SetPos(12);

m_CHour.SetWindowText(_T("8"));

//设置 分钟 微调按钮
CSpinButtonCtrl *pMINUTE = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN5);

ASSERT(pMINUTE!=NULL);
//设置伙伴窗口

pMINUTE->SetBuddy(GetDlgItem(IDC_MINUTE));

pMINUTE->SetRange(0,59);

pMINUTE->SetPos(0);

m_CMinute.SetWindowText(_T("8"));

//设置 秒 微调按钮
CSpinButtonCtrl *pSECOND = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN6);

ASSERT(pSECOND!=NULL);

//设置伙伴窗口

pSECOND->SetBuddy(GetDlgItem(IDC_SECOND));

pSECOND->SetRange(0,59);

pSECOND->SetPos(0);

m_CSecond.SetWindowText(_T("8"));

4.设定时间
UpdateData(TRUE);

SYSTEMTIME sysTime;

sysTime.wYear =m_Year;

sysTime.wMonth =m_Month;

sysTime.wDay = m_Day;

sysTime.wHour =m_Hour;

sysTime.wMinute =m_Minute;

sysTime.wSecond =m_Second;

SetLocalTime(&sysTime);

UpdateData(FALSE);

5.完成
////////////////////////////////////////////////////////////////////////////////////////
接下来是音量控制,背光控制,任务栏隐藏,
1.隐藏任务栏,先定义一个全局变量控制。

CWnd * hwndTaskBar = FindWindow(TEXT("HHTaskBar"), NULL);
//获取wince任务栏句柄
if (m_HideTaskBar == FALSE)

{

if(hwndTaskBar)

{

hwndTaskBar->EnableWindow(FALSE);
//窗体失效
hwndTaskBar->ShowWindow(SW_HIDE);
//窗体隐藏
m_HideTaskBar = TRUE;

}

}
else

{

if(hwndTaskBar)

{

hwndTaskBar->EnableWindow(TRUE);
//窗体有效
hwndTaskBar->ShowWindow(SW_SHOW);
//窗体显示
m_HideTaskBar = FALSE;

}

}

2.控制屏幕点击音。这个有点麻烦,同样设定一个全局变量控制下。
//点击屏幕声 Screen 0:无声 1:柔和 65538:洪亮
HKEY m_hKey;

LPCTSTR Screen=_T("Screen");

LPCTSTR son_Key=_T("ControlPanel\\Volume\\");

DWORD ScreenNumber = 0;

DWORD ReturnValue=RegOpenKeyEx(HKEY_CURRENT_USER,son_Key,0,0,&m_hKey);
//写注册表修改按键音
if (FALSE == m_ScreenClick)

{

if(ReturnValue==ERROR_SUCCESS)

{

DWORD SetValue=RegSetValueEx(m_hKey,Screen,0,REG_DWORD,(LPBYTE)&ScreenNumber,sizeof(DWORD));
//送按键音值,使按键音失效
}

RegCloseKey(m_hKey);

Apply();

m_ScreenClick = TRUE;

}

else

{

if(ReturnValue==ERROR_SUCCESS)

{

DWORD ScreenNumber = 1;


DWORD SetValue=RegSetValueEx(m_hKey,Screen,0,REG_DWORD,(LPBYTE)&ScreenNumber,sizeof(DWORD));
//送按键音值,使按键音有效
}

RegCloseKey(m_hKey);

Apply();

m_ScreenClick = FALSE;

}
以前参考Norains的修改注册表类。其实有点麻烦。直接用RegSetValueEx去修改还更直接。CReg类也是调用了这个东西。而且要区分DWORD和STRING型。在这两个类新上我也话了不少时间。不同的类型控制效果是不一样的。如果串了类新可能会失效。就是REG_DWORD这个东西。
======================================================================
3.音量控制。这个同样是修改注册表。两个按钮。+/-,加减的步进值都是0x33333333。
if (m_vol != 0x0)

{

m_vol = m_vol - 0x33333333;

}

//SetVolume(m_vol);

waveOutSetVolume(0,m_vol);

m_volshow = m_vol;

this->UpdateData(FALSE);
减法
if (m_vol != 0xFFFFFFFF)

{

m_vol = m_vol + 0x33333333;

}

//SetVolume(m_vol);

m_volshow = m_vol;

waveOutSetVolume(0,m_vol);

this->UpdateData(FALSE);
加法

这里有个问题是忘记了获取系统当前音量。这个大家自己加下。就是要获取下注册表里当前音量的值赋值给m_vol就好了
====================================================================
背光设置。这里要用到修改注册表和用背光流驱动两个方向去修改
1.代码如下:
HKEY hKey;

DWORD dwType=0;

DWORD dwState=Lumin;

hStr = CreateFile(_T("BKL1:"),GENERIC_READ| GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL);
//读取底层驱动,通过底层驱动用流式文件形式修改背光
if (DeviceIoControl(hStr,IOCTL_BACKLIGHT_GET,NULL,NULL,&Lumin,sizeof(Lumin),NULL,NULL))

{

++Lumin;

// ::AfxMessageBox(Lumin);

}

if((Lumin>0)&&(Lumin<6))

{

if (DeviceIoControl(hStr,IOCTL_BACKLIGHT_SET,&Lumin,sizeof(Lumin),NULL,0,NULL,NULL))
{

// ::AfxMessageBox(_T("set ok!"));

}


if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("ControlPanel\\Backlight\\"),0,0,&hKey))
{


RegSetValueEx(hKey, TEXT("BacklightCurrentLevel"),0,REG_DWORD,(BYTE*)&dwState,sizeof(DWORD));

}

Apply();

HANDLE hBL=CreateEvent(NULL,FALSE,FALSE,TEXT("BackLightChangeEvent"));

if(hBL)

{

SetEvent(hBL);

CloseHandle(hBL);

}

RegCloseKey(hKey);

}
加背光

HKEY hKey;

DWORD dwType=0;

DWORD dwState=Lumin;

hStr = CreateFile(_T("BKL1:"),GENERIC_READ| GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL);
//读取底层驱动,通过底层驱动用流式文件形式修改背光
if (DeviceIoControl(hStr,IOCTL_BACKLIGHT_GET,NULL,0,&Lumin,sizeof(Lumin),NULL,NULL))

{

--Lumin;
// ::AfxMessageBox(Lumin);

}

if((Lumin>0)&&(Lumin<6))

{

if (DeviceIoControl(hStr,IOCTL_BACKLIGHT_SET,&Lumin,sizeof(Lumin),NULL,0,NULL,NULL))

{

// ::AfxMessageBox(_T("set ok!"));

}


if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("ControlPanel\\Backlight\\"),0,0,&hKey))

{

RegSetValueEx(hKey, TEXT("BacklightCurrentLevel"),0,REG_DWORD,(BYTE*)&Lumin,sizeof(DWORD));

}

Apply();

HANDLE hBL=CreateEvent(NULL,FALSE,FALSE,TEXT("BackLightChangeEvent"));

if(hBL)

{

SetEvent(hBL);

CloseHandle(hBL);

}


RegCloseKey(hKey);

}
减背光
BKL1这个可以按照你的自己注册的BKL来定。
===================================================================
以上就是这整个程序组的参考代码希望给大家有所帮助
xumercury@gmail.com

【转帖By:Norains】CReg类轻松读取注册表收藏

//========================================================================
//TITLE:
// CReg类轻松读取注册表
//AUTHOR:
// norains
//DATE:
// Sunday 8-April-2007
//Environment:
// EVC4.0 + Standard SDK
//========================================================================

开篇之处先说说这个类的来历.准确的说,这个类是我垂诞已久的东东,昨天在查看微软的控制面板的代码时,不小心发现的.觉得使用上挺便利的,所以本着"洋为中用"的原则,拷贝出来用吧!

/**//////////////////////////////////////////////////////////////////////
// Reg.h: interface for the CReg class.
//
//Version:
// 1.0.0
//Date:
// 2007.04.07
/**///////////////////////////////////////////////////////////////////////

#ifndef REG_H
#define REG_H



class CReg
...{
public:
BOOL DeleteKey(LPCTSTR szName);
BOOL DeleteValue(LPCTSTR szName);
BOOL SetMultiSZ(LPCTSTR szName, LPCTSTR lpszValue, DWORD dwLen);
BOOL SetBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen);
BOOL SetDW(LPCTSTR szName, DWORD dwValue);
BOOL SetSZ(LPCTSTR szName, LPCTSTR szValue);
BOOL SetSZ(LPCTSTR szName, LPCTSTR szValue, DWORD dwLen);
DWORD GetValueDW(LPCTSTR szName, DWORD dwDefault=0);
LPCTSTR GetValueSZ(LPCTSTR szName);
LPBYTE GetValueBinary(LPCTSTR szName);
DWORD GetValueBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen);
BOOL GetValueSZ(LPCTSTR szName, LPTSTR szValue, DWORD dwLen);
BOOL EnumValue(LPTSTR pszName, DWORD dwLenName, LPTSTR pszValue, DWORD dwLenValue);
BOOL EnumKey(LPTSTR psz, DWORD dwLen);
BOOL IsOK();
operator HKEY();
void Reset();
CReg(HKEY hkRoot, LPCTSTR pszKey);
BOOL Open(HKEY hkRoot, LPCTSTR pszKey, REGSAM sam=KEY_READ);
BOOL Create(HKEY hkRoot, LPCTSTR pszKey);
CReg();
virtual ~CReg();

private:
HKEY m_hKey;
int m_Index;
LPBYTE m_lpbValue; // last value read, if any
};

#endif //#ifndef REG_H



/**///////////////////////////////////////////////////////////////////////
// Reg.cpp: implementation of the CReg class.
//
/**///////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Reg.h"


//=======================================================================
//Macro define
#define MyFree(p) { if(p) LocalFree(p); }
//=======================================================================
/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**///////////////////////////////////////////////////////////////////////

CReg::CReg()
...{
m_hKey = NULL;
m_Index = 0;
m_lpbValue = NULL;
}

CReg::CReg(HKEY hkRoot, LPCTSTR pszKey)
...{
m_hKey = NULL;
m_Index = 0;
m_lpbValue = NULL;
Open(hkRoot, pszKey);
}


CReg::~CReg()
...{
if(m_hKey)
...{
RegCloseKey(m_hKey);
}
MyFree(m_lpbValue);
}


//-------------------------------------------------------------------
//Description:
// Create the key
//-------------------------------------------------------------------
BOOL CReg::Create(HKEY hkRoot, LPCTSTR pszKey)
...{
DWORD dwDisp;
return ERROR_SUCCESS == RegCreateKeyEx(hkRoot, pszKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisp);
}


//-------------------------------------------------------------------
//Description:
// Open the key
//-------------------------------------------------------------------
BOOL CReg::Open(HKEY hkRoot, LPCTSTR pszKey, REGSAM sam)
...{
return ERROR_SUCCESS == RegOpenKeyEx(hkRoot, pszKey, 0, sam, &m_hKey);
}

//-------------------------------------------------------------------
//Description:
// Reset the value
//-------------------------------------------------------------------
void CReg::Reset()
...{
if(m_hKey)
...{
RegCloseKey(m_hKey);
}
MyFree(m_lpbValue);
m_hKey = NULL;
m_Index = 0;
m_lpbValue = NULL;
}

//-------------------------------------------------------------------
//Description:
// Operator overload
//-------------------------------------------------------------------
CReg::operator HKEY()
...{
return m_hKey;
}

//-------------------------------------------------------------------
//Description:
// Test whether is the handle of the key OK for next operate
//-------------------------------------------------------------------
BOOL CReg::IsOK()
...{
return m_hKey != NULL;
}


//-------------------------------------------------------------------
//Description:
// Enum the key
//-------------------------------------------------------------------
BOOL CReg::EnumKey(LPTSTR psz, DWORD dwLen)
...{
if(!m_hKey)
...{
return FALSE;
}

return ERROR_SUCCESS == RegEnumKeyEx(m_hKey, m_Index++, psz, &dwLen, NULL, NULL, NULL, NULL);
}


//-------------------------------------------------------------------
//Description:
// Enum registry Value
//-------------------------------------------------------------------
BOOL CReg::EnumValue(LPTSTR pszName, DWORD dwLenName, LPTSTR pszValue, DWORD dwLenValue)
...{
DWORD dwType;

if(!m_hKey)
...{
return FALSE;
}

dwLenValue *= sizeof(TCHAR); // convert length in chars to bytes

return ERROR_SUCCESS == RegEnumValue(m_hKey, m_Index++, pszName, &dwLenName, NULL, &dwType, (LPBYTE)pszValue, &dwLenValue);
}


//-------------------------------------------------------------------
//Description:
// Get the string value
//-------------------------------------------------------------------
BOOL CReg::GetValueSZ(LPCTSTR szName, LPTSTR szValue, DWORD dwLen)
...{
if(!m_hKey)
...{
return FALSE;
}

dwLen *= sizeof(TCHAR); // convert length in chars to bytes

return ERROR_SUCCESS == RegQueryValueEx(m_hKey, szName, NULL, NULL, (LPBYTE)szValue, &dwLen);
}

//-------------------------------------------------------------------
//Description:
// Get the binary value
//-------------------------------------------------------------------
DWORD CReg::GetValueBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen)
...{
if(!m_hKey)
...{
return FALSE;
}

DWORD dwLenWant = dwLen;
if(ERROR_SUCCESS == RegQueryValueEx(m_hKey, szName, NULL, NULL, lpbValue, &dwLen))
...{
return dwLen;
}
else
...{
return 0;
}
}


//-------------------------------------------------------------------
//Description:
// Get the binary value
//-------------------------------------------------------------------
LPBYTE CReg::GetValueBinary(LPCTSTR szName)
...{
return (LPBYTE)GetValueSZ(szName);
}


//-------------------------------------------------------------------
//Description:
// Get the string value
//-------------------------------------------------------------------
LPCTSTR CReg::GetValueSZ(LPCTSTR szName)
...{
return 0;
}


//-------------------------------------------------------------------
//Description:
// Get the DWORD value
//
//Parameters:
// szName:[in] The value of registry
// dwDefault:[in] The default value return when failed in getting the
//DWORD value.
//-------------------------------------------------------------------
DWORD CReg::GetValueDW(LPCTSTR szName, DWORD dwDefault)
...{
if(!m_hKey)
...{
return FALSE;
}
DWORD dwValue = dwDefault;
DWORD dwLen = sizeof(DWORD);
RegQueryValueEx(m_hKey, szName, NULL, NULL, (LPBYTE)&dwValue, &dwLen);
return dwValue;
}


//-------------------------------------------------------------------
//Description:
// Set the string value
//-------------------------------------------------------------------
BOOL CReg::SetSZ(LPCTSTR szName, LPCTSTR szValue, DWORD dwLen)
...{
//Prefix
if(!m_hKey)
...{
return FALSE;
}

return ERROR_SUCCESS == RegSetValueEx(m_hKey, szName, 0, REG_SZ, (LPBYTE)szValue, sizeof(TCHAR)*dwLen);
}


//-------------------------------------------------------------------
//Description:
// Set the string value
//-------------------------------------------------------------------
BOOL CReg::SetSZ(LPCTSTR szName, LPCTSTR szValue)
...{
return SetSZ(szName, szValue, 1+lstrlen(szValue));
}


//-------------------------------------------------------------------
//Description:
// Get the DWORD value
//-------------------------------------------------------------------
BOOL CReg::SetDW(LPCTSTR szName, DWORD dwValue)
...{
//Prefix
if(!m_hKey)
...{
return FALSE;
}

return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));
}


//-------------------------------------------------------------------
//Description:
// Get the binary value
//-------------------------------------------------------------------
BOOL CReg::SetBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen)
...{
//Prefix
if(!m_hKey)
...{
return FALSE;
}

return ERROR_SUCCESS == RegSetValueEx(m_hKey, szName, 0, REG_BINARY, lpbValue, dwLen);
}


//-------------------------------------------------------------------
//Description:
// Set the Multi value
//-------------------------------------------------------------------
BOOL CReg::SetMultiSZ(LPCTSTR szName, LPCTSTR lpszValue, DWORD dwLen)
...{
return ERROR_SUCCESS == RegSetValueEx(m_hKey, szName, 0, REG_MULTI_SZ, (LPBYTE)lpszValue, sizeof(TCHAR)*dwLen);
}


//-------------------------------------------------------------------
//Description:
// Delete the value
//-------------------------------------------------------------------
BOOL CReg::DeleteValue(LPCTSTR szName)
...{
//Prefix
if(!m_hKey)
...{
return FALSE;
}
//
return ERROR_SUCCESS == RegDeleteValue(m_hKey, szName);
}



//-------------------------------------------------------------------
//Description:
// Delete Key
//-------------------------------------------------------------------
BOOL CReg::DeleteKey(LPCTSTR szName)
...{
if(!m_hKey)
...{
return FALSE;
}

return ERROR_SUCCESS == RegDeleteKey(m_hKey, szName);
}


使用CReg类读取注册表非常方便,至少不用再去翻查platform builder文档上的注册表函数了^_^.

以将注册表中"HKEY_CURRENT_USER\ControlPanel\Volume"的"Screen"(DWORD类型)数值设置为2作例子:
CReg reg(HKEY_CURRENT_USER,TEXT("ControlPanel\Volume"));
reg.SetDW(TEXT("Screen"),Screen);

要读取也挺简单:
DWORD dwValue = reg.GetValueDW(TEXT("Screen"));

其它函数的功能,可以依照函数名推断,并且使用方法也很简单,在此不再赘述.

需要注意的是,这些代码是直接从微软代码集中拷贝过来的,原代码GetValueBinary(LPCTSTR szName)和GetValueSZ(LPCTSTR szName)的功能尚未完成.最近因为工作关系,在发表这篇豆腐块前,也没将这两个函数补完.如果各位朋友有兴趣,可以自行将之补全.当然,如果补全后 能给我发封e-mail,我会表示最衷心的感激:-)

【转帖by:norains】WinCE系统音量的设置收藏

//========================================================================
//TITLE:
// WinCE系统音量的设置
//AUTHOR:
// norains
//DATE:
// Sunday 8-April-2007
//Environment:
// EVC4.0 + Standard SDK 4.2
// EVC4.0 + Standard SDK 5.0
//========================================================================

首先我们来看一段最简单的改变音量的代码:
DWORD dwVolume = 0xAAAAAAAA;
waveOutSetVolume(0,dwVolume);


waveOutSetVolume()的第一个参数是设备ID,因为需要更改的是整个系统音量,所以在这里直接取0值即可;第二个参数是需要设置的音量数值,范围是从 0x0 ~ 0xFFFFFFFF.

但这个函数的功能却也是非常有限的,也就是说,它只能更改系统的主音量;如果想修改屏幕点击声,则就无能为力.

有些细心的朋友会从"控制面板"的"声音"入手,发现每次在控制面板调节声音,相应的"ControlPanel\Volume"下的键值数值都会变更.但如果是直接修其下的改注册表,却是无论如何都达不到相应的功能的----因为没有通知系统,注册表已经被修改.

如果需要告知系统,注册表已经修改,并请系统依照修改的数值来更改音量,则需要调用微软一个未公开的函数:AudioUpdateFromRegistry().

这个函数在文档中是无法搜索到,如果需要调用这个函数,可以有两种方法.

一是直接包含"pwinuser.h"文件,然后直接调用.

二是调用coredll.dll库,引出该函数并使用.

这里展示一个调用的例子:
typedef void (WINAPI *DLL_AUDIOUPDATEFROMREGISTRY)();

DLL_AUDIOUPDATEFROMREGISTRY Dll_AudioUpdateFromRegistry = NULL;
HINSTANCE hCoreDll = LoadLibrary(TEXT("coredll.dll"));
if (hCoreDll)
...{
Dll_AudioUpdateFromRegistry = (DLL_AUDIOUPDATEFROMREGISTRY)GetProcAddress(hCoreDll, _T("AudioUpdateFromRegistry"));
if (Dll_AudioUpdateFromRegistry)
...{
(Dll_AudioUpdateFromRegistry)();
}

只要更新了注册表,然后调用该函数,则系统会根据键值来进行相应的调整.

那么现在让我们来看看位于"ControlPanel\Volume"注册表中各键值的意义:

Volume: 系统的主音量,范围是0x0 ~ 0xFFFFFFFF.

Screen: 屏幕敲击声. 当数值为0时即为无声,1为柔和,65538为洪亮

Key: 键盘敲击声,数值的意义和Screen相同.

Mute: 控制其它静音的选项. 置0x04位为1时允许事件声音,0x02允许应用程序声音,0x01允许警告声.需要注意的是,如果不允许应用程序声音,则警告声位也将被忽略.


如果每次更改音量都要改写注册表,调用动态链接库,会显得比较麻烦.为了写代码的便利,在此封装了这个声音的操作:
(注:CReg 请参见此篇文章:http://blog.csdn.net/norains/archive/2007/04/08/1556296.aspx)

/**///////////////////////////////////////////////////////////////////////
// SysVolume.h: interface for the CSysVolume class.
//
//Version:
// 1.0.0
//Date:
// 2007.04.08
/**///////////////////////////////////////////////////////////////////////

#ifndef SYSVOLUME_H
#define SYSVOLUME_H



#include "Reg.h"

//-------------------------------------------------------------------------
//Macro define
#define MIN_VOLUME 0
#define MAX_VOLUME 0xFFFFFFFF
//-------------------------------------------------------------------------
//Enum value
enum VolumeModeType
...{
VOL_SOFT,
VOL_LOUD,
VOL_MUTE
};
//------------------------------------------------------------------------

class CSysVolume
...{
public:
BOOL SetVolumeScreenTap(VolumeModeType volMode);
BOOL SetVolumeKeyClick(VolumeModeType volMode);
BOOL EnableSoundNotification(BOOL bEnable);
BOOL EnableSoundApplication(BOOL bEnable);
BOOL EnableSoundEvent(BOOL bEnable);
BOOL SetVolume(DWORD dwVol);
CSysVolume();
virtual ~CSysVolume();

protected:
BOOL Apply();
CReg m_Reg;
};

#endif //#ifndef SYSVOLUME_H


/**///////////////////////////////////////////////////////////////////////
// SysVolume.cpp: implementation of the CSysVolume class.
//
/**///////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SysVolume.h"


//======================================================================
//Macro define

//Registry KEY
#define BASE_KEY HKEY_CURRENT_USER
#define SUB_KEY TEXT("ControlPanel\Volume")
#define VALUE_VOLUME TEXT("Volume")
#define VALUE_SCREEN TEXT("Screen")
#define VALUE_KEY TEXT("key")
#define VALUE_MUTE TEXT("Mute")


//For the screen tap and the key click
#define VOL_VALUE_MUTE 0
#define VOL_VALUE_LOUD 65538
#define VOL_VALUE_SOFT 1


//The bit for sound
#define BIT_EVENT 0x4
#define BIT_APPLICATION 0x2
#define BIT_NOTIFICATION 0x1
//======================================================================
/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**///////////////////////////////////////////////////////////////////////

CSysVolume::CSysVolume()
...{
m_Reg.Create(BASE_KEY, SUB_KEY);
}

CSysVolume::~CSysVolume()
...{

}





//---------------------------------------------------------------------
//Description:
// Apply the volume
//---------------------------------------------------------------------
BOOL CSysVolume::Apply()
...{
typedef void (WINAPI *DLL_AUDIOUPDATEFROMREGISTRY)();

DLL_AUDIOUPDATEFROMREGISTRY Dll_AudioUpdateFromRegistry = NULL;
HINSTANCE hCoreDll = LoadLibrary(TEXT("coredll.dll"));
if (hCoreDll)
...{
Dll_AudioUpdateFromRegistry = (DLL_AUDIOUPDATEFROMREGISTRY)GetProcAddress(hCoreDll, _T("AudioUpdateFromRegistry"));
if (Dll_AudioUpdateFromRegistry)
...{
(Dll_AudioUpdateFromRegistry)();
}
else
...{
return FALSE;
}
FreeLibrary(hCoreDll);
}
else
...{
return FALSE;
}
return TRUE;
}



//---------------------------------------------------------------------
//Description:
// Enable the sound for events
//---------------------------------------------------------------------
BOOL CSysVolume::EnableSoundEvent(BOOL bEnable)
...{
if(m_Reg.IsOK() != TRUE)
...{
return FALSE;
}

DWORD dwVal = m_Reg.GetValueDW(VALUE_MUTE);

if(bEnable == TRUE)
...{
dwVal |= BIT_EVENT;
}
else
...{
dwVal &= ~BIT_EVENT;
}

m_Reg.SetDW(VALUE_MUTE,dwVal);

return Apply();
}


//---------------------------------------------------------------------
//Description:
// Enable the sound for application
//---------------------------------------------------------------------
BOOL CSysVolume::EnableSoundApplication(BOOL bEnable)
...{
if(m_Reg.IsOK() != TRUE)
...{
return FALSE;
}

DWORD dwVal = m_Reg.GetValueDW(VALUE_MUTE);

if(bEnable == TRUE)
...{
dwVal |= BIT_APPLICATION;
}
else
...{
dwVal &= ~BIT_APPLICATION;
}

m_Reg.SetDW(VALUE_MUTE,dwVal);

return Apply();
}


//---------------------------------------------------------------------
//Description:
// Enable the sound for notifications. If the sound of application is
//mute, the sound of notification is mute too.
//---------------------------------------------------------------------
BOOL CSysVolume::EnableSoundNotification(BOOL bEnable)
...{
if(m_Reg.IsOK() != TRUE)
...{
return FALSE;
}

DWORD dwVal = m_Reg.GetValueDW(VALUE_MUTE);

if(bEnable == TRUE)
...{
dwVal |= BIT_NOTIFICATION;
}
else
...{
dwVal &= ~BIT_NOTIFICATION;
}

m_Reg.SetDW(VALUE_MUTE,dwVal);

return Apply();
}


//---------------------------------------------------------------------
//Description:
// Set the key click volume
//---------------------------------------------------------------------
BOOL CSysVolume::SetVolumeKeyClick(VolumeModeType volMode)
...{

DWORD dwVol = 0;

switch(volMode)
...{
case VOL_SOFT:
dwVol = VOL_VALUE_SOFT;
break;
case VOL_LOUD:
dwVol = VOL_VALUE_LOUD;
break;
case VOL_MUTE:
dwVol = VOL_VALUE_MUTE;
break;
}

if(m_Reg.IsOK() != TRUE)
...{
return FALSE;
}
m_Reg.SetDW(VALUE_KEY,dwVol);

return Apply();
}


//---------------------------------------------------------------------
//Description:
// Set the screen tap volume
//---------------------------------------------------------------------
BOOL CSysVolume::SetVolumeScreenTap(VolumeModeType volMode)
...{
DWORD dwVol = 0;

switch(volMode)
...{
case VOL_SOFT:
dwVol = VOL_VALUE_SOFT;
break;
case VOL_LOUD:
dwVol = VOL_VALUE_LOUD;
break;
case VOL_MUTE:
dwVol = VOL_VALUE_MUTE;
break;
}

if(m_Reg.IsOK() != TRUE)
...{
return FALSE;
}
m_Reg.SetDW(VALUE_SCREEN,dwVol);
return Apply();
}


//---------------------------------------------------------------------
//Description:
// Set the volume.
//
//Parameters:
// dwVol: The volume to set. And the range is MIN_VOLUME ~ MAX_VOLUME
//---------------------------------------------------------------------
BOOL CSysVolume::SetVolume(DWORD dwVol)
...{
if(dwVol <> MAX_VOLUME)
...{
return FALSE;
}
m_Reg.SetDW(VALUE_VOLUME,dwVol);
return Apply();
}

由于CSysVolume类将复杂的操作封装在内部,因此设置音量的非常简单.

以更改屏幕敲击声为洪亮为例:
CSysVolume sysVol;
sysVol.SetVolumeScreenTap(VOL_LOUD);
 
Copyright © 阿肆 Mercury Xu