查看文章
 
借用CHome小桥天气(cWeather)组件在自己的程序中显示天气情况
2009-10-29 2:36

有时候很需要快速了解一下当日天气情况,但是找了好多个天气相关的软件,除了CHome里的cWeather组件以外,其他的都不怎么方便,为了看个天气情况,甚至要把PPC今日屏幕主题壁纸都让出来(如MiniWeather),要么就是要安装一个相对庞大的软件(如口袋天气、天气秀、无限今日等),而我又不喜欢6.5的CHome,最后决定把cWeather提取出来在自己的今日插件里借用一下,以下是效果图:


cWeather的核心组件是cWeatherUpdate.exe,一个45KB的无界面程序,这个程序每次运行后只负责这三个步骤:
1.读取HKEY_LOCAL_MACHINE\Software\Microsoft\CHome\CWeather\Page1---Page[N]的city值
2.联网并依次查询每个Page[N]的详细天气情况,URL为http://w.xbeta.cn/default.aspx?name=%s,但是光凭这个%s并无法直接得到天气数据,肯定还经过了wscat了其他参数,未详细分析(借用而已,点到为止,嘿嘿,并不想自己再费老半天精力去重写一个connmgr连接和winsock)
3.读取返回数据并依据格式分离填充回注册表HKEY_LOCAL_MACHINE\Software\Microsoft\CHome\CWeather\Page1---Page[N]里各个项目,并填充HKEY_LOCAL_MACHINE\Software\Microsoft\CHome\CWeather\CondensedPage作为在CHome面板里的显示数据

以上工作完成后它会自己断开联网,挺人性化的(cWeatherUpdate.exe是基于WM6 SDK编译的,也就是说只适用于WM6.1以上机型,WM5用户请排队泪奔)

每次cWeather组件执行后,系统注册表就会填充如下数据,这是被CHome的一个貌似倒退的特性所迫:它是通过注册表交互的。当然,要是你把一个插件dll写成CHome的COM Server并在注册表相关项目里指定它的GUID也是可以干活的,似乎微软官方本意是如此来着,但是我没找到相关的详细开发文档,而且发现市面上目前都是用 注册表相关位置读写+刷新CHome 的方法来实现自己的CHome插件的,一个典型例子:CHome的无线通讯管理面板……为了这个面板,用户必须安装MortScript并后台在时刻跑着这个程序,因为那个面板的数据更新工作是靠Mort脚本实现的……囧……我就不过多评价了,作为程序开发者,我十分不喜欢这样低效率的运作形式。

跑题了,话说cWeather的主要功劳就是产生了以下注册表项目(有缩减):
[HKEY_LOCAL_MACHINE\Software\Microsoft\CHome\CWeather\CondensedPage]
"Temp3"="22/30℃"
"IconD3"="\\Windows\\d01.png"
"City3"="南宁"
"Temp2"="21/30℃"
"IconD2"="\\Windows\\d00.png"
"City2"="惠州"
"PluginLabel"="晴21/30℃"
"Temp1"="21/30℃"
"wind"="微风"
"ssd"="舒适度:较不舒适"
"chy"="穿衣:炎热"
"xch"="洗车:适宜"
"zyx"="紫外线:很强"
"Label"="晴"
"IconD1"="\\Windows\\d00.png"
"CurSD"="湿度:79%"
"City1"="广州"

[HKEY_LOCAL_MACHINE\Software\Microsoft\CHome\CWeather\Page1]
"Temp1"="21/30℃"
"wind"="微风"
"ssd"="舒适度:较不舒适"
"chy"="穿衣:炎热"
"xch"="洗车:适宜"
"zyx"="紫外线:很强"
"Label"="晴"
"CurSD"="湿度:79%"
"CurTemp"="21.1℃"
"City"="广州"
---------------------------------------------------------------------------------------

因此要借用cWeather是最简单不过的事情了,CreateProcess一下它,等待执行完毕后读取注册表里Page1或CondensedPage的city、Temp1等数据就是今日的天气情况了。

获取注册表并读取组合出来的代码如下(我最恨C里面的字符串操作转换,谁有更高效的TCHAR[]数组转LPTSTR的方法?我这个写法总觉得有些不妥):
LPTSTR GetTodayWeather()
{
//显示效果:广州 晴 21/30℃ 湿度:79%
TCHAR szWeatherBuffer[64]=TEXT("");
TCHAR pszTodayWeatherCity[32];
LPTSTR retTodayWeatherCity = new TCHAR[32];

TCHAR pszTodayWeatherLabel[32];
LPTSTR retTodayWeatherLabel = new TCHAR[32];

TCHAR pszTodayWeatherTemp[32];
LPTSTR retTodayWeatherTemp = new TCHAR[32];

TCHAR pszTodayWeatherSD[32];
LPTSTR retTodayWeatherSD = new TCHAR[32];

HRESULT hr;
//获取城市
hr = RegistryGetString(HKEY_LOCAL_MACHINE,
   TEXT("Software\\Microsoft\\CHome\\CWeather\\Page1"),
   TEXT("City"),
   pszTodayWeatherCity,32);
if(SUCCEEDED(hr)){
   lstrcpy(retTodayWeatherCity,pszTodayWeatherCity);
}else{
   lstrcpy(retTodayWeatherCity,TEXT("未知"));
}
//获取天气
hr = RegistryGetString(HKEY_LOCAL_MACHINE,
   TEXT("Software\\Microsoft\\CHome\\CWeather\\Page1"),
   TEXT("Label"),
   pszTodayWeatherLabel,32);
if(SUCCEEDED(hr)){
   lstrcpy(retTodayWeatherLabel,pszTodayWeatherLabel);
}else{
   lstrcpy(retTodayWeatherLabel,TEXT("未知"));
}
//获取温度
hr = RegistryGetString(HKEY_LOCAL_MACHINE,
   TEXT("Software\\Microsoft\\CHome\\CWeather\\Page1"),
   TEXT("Temp1"),
   pszTodayWeatherTemp,32);
if(SUCCEEDED(hr)){
   lstrcpy(retTodayWeatherTemp,pszTodayWeatherTemp);
}else{
   lstrcpy(retTodayWeatherTemp,TEXT("未知"));
}
//获取湿度
hr = RegistryGetString(HKEY_LOCAL_MACHINE,
   TEXT("Software\\Microsoft\\CHome\\CWeather\\Page1"),
   TEXT("CurSD"),
   pszTodayWeatherSD,32);
if(SUCCEEDED(hr)){
   lstrcpy(retTodayWeatherSD,pszTodayWeatherSD);
}else{
   lstrcpy(retTodayWeatherSD,TEXT("未知"));
}

wcscat(szWeatherBuffer,pszTodayWeatherCity);
wcscat(szWeatherBuffer,TEXT(" "));
wcscat(szWeatherBuffer,retTodayWeatherLabel);
wcscat(szWeatherBuffer,TEXT(" "));
wcscat(szWeatherBuffer,retTodayWeatherTemp);
wcscat(szWeatherBuffer,TEXT(" "));
wcscat(szWeatherBuffer,retTodayWeatherSD);
if( retTodayWeatherCity ) delete retTodayWeatherCity;
if( retTodayWeatherLabel ) delete retTodayWeatherLabel;
if( retTodayWeatherTemp ) delete retTodayWeatherTemp;
if( retTodayWeatherSD ) delete retTodayWeatherSD;
return (LPTSTR)szWeatherBuffer;
}


类别:我的程序代码||添加到搜藏 |分享到i贴吧|浏览(5569)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu