众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸。

我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是:

上网,搜索bing

找到图片的下载链接,并下载之

将图片设置为桌面背景(也有部分浏览器支持直接在网页中右击图片设置为壁纸)

可能你还会删除下载下来的图片

作为一枚coder,你不会觉得麻烦嘛?至少需要三个步骤呢!

So...我就用C++语言写了一个小程序,用于获取bing网站的图片,并将其设置为桌面背景。整个过程只需要点击.exe文件,一键完成!

当然,你也可以通过本程序,窥见Windows API的些许用法,活学活用C++知识!

当然网上也存在片片断断的程序,我的部分程序也借鉴了它们的思想,在此感谢互联网和辛勤的贡献者们。

以下是程序设计的技术要点:

--------------------------------------------------------------

技术要点:

1、获取网络地址 直接使用网络地址或下载 注意若下载下来后,要将\转换为/,当然也可以用\\

网络地址可以从这里获取:http://cn.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1

在返回的xml页面中(images->image->url)找到具体的图片地址(xml解析),拼接到bing域名后面构成完整地址

注:xml解析用了TinyXml2

2、转换图片格式(jpg->bmp),本程序中的SystemParametersInfoA函数只支持bmp

在程序中自动转换(单单改后缀名是没有用的),转换用的程序是从网上下载的,用C语言编写而成

考虑到需要改后缀名,那就直接下载图片好了,顺便存储之

3、图片保存路径为C:/Users/Administrator/bingPicture/,格式为.jpg 方便以后浏览

注意:部分用户电脑可能不存在路径C:/Users/Administrator/,造成程序无法执行,可以直接在C盘根目录下创建路径,如C:/bingPicture/

注意不保存转换后的bmp格式图片(设置背景后即删除),因为体积较大

判断文件夹是否存在,若不存在,则自动创建文件夹

4、注意本程序获取的图片尺寸是1366x768,若你的屏幕分辨率为1920x1080,还需要对Xml解析出来的图片Url地址进行字符串替换(将1366x768换成1920x1080即可)

前提:针对1920x1080尺寸的图片地址存在

5、若此程序若在国际网络下运行,获取的就是国际版bing壁纸;若在国内网络下运行,获取的就是中国版bing壁纸。因此在同一天内,在不同网络环境下获取的图片可能不同

*未实现的功能*:

1、获取每日壁纸的故事(利用bing故事接口) ,更新壁纸后显示在执行框中

2、开机自启动,并隐藏到托盘中(为减少CPU占用并增加趣味性,设置为开机自动启动,提示网络连接,并输入"go"才执行功能)

电脑若未关机,则在24:00自动启动,更换背景

3、软件自动更新版本功能

--------------------------------------------------------------

程序在文章后面提供,源码已注释很详细,不再赘述。

注意,使用程序之前,务必看以下注意事项:

--------------------------------------------------------------

请注意:

1、本软件使用Qt开发,您也可以将文件加入自己的工程,使用其他IDE开发

需要注意的一点是,本软件需要加入URLMON.DLL(源码包中有)

2、本软件开源(源码位于xiaoxi666的博客园以及github,不对其他地址给出的链接负责),仅用于学习交流,请勿用于商业用途

3、为防止软件被加入恶意功能,不提供可执行文件,若需使用请重新编译,编译器需要支持c++11

4、本软件程序中内含删除临时文件功能,请在更改前仔细确认,避免路径错误而删除其他重要文件

--------------------------------------------------------------

然而许多小伙伴要体验效果,我就一并把可执行文件放出来吧(请勿随意传播.exe文件防止有人添加恶意功能。当然源码开放可共享)

下载区:

可执行文件(可执行文件中图片保存地址为C:/bingPicture/)

但一定要注意核对文件校验码(以保证安全):

可执行文件压缩包WallPaper校验码

MD5: 48173BA7DCF2120F2822226A5D4A90CF

SHA1: CEB0ED570AF613EC3829AC8FDE4F8C50DDEF4101

可执行文件WallPaper_1366x768_Common校验码(此版本用于1366x768分辨率)

MD5: ACDA8E5E4CF0B2916254B233D1243FD3

SHA1: 6041C813DC8E2AE29EA8675EF279CFC0E7921D53

可执行文件WallPaper_1920x1080_Common校验码(此版本用于1920x1080分辨率)

MD5: 474570808A56EFDC7B589F605D08C5B6

SHA1: B78921AD655B35F079076904A22F1A0E5122EB7F

为方便浏览,贴出主要源程序:

main.cpp文件

1 //main.cpp

2 /******************windows桌面背景更换C++程序***********************************************************

3 功能:获取每日bing搜索主页图片,设置为当日桌面壁纸。并将其下载保存至本地文件夹方便以后浏览

4 作者:xiaoxi666

5 日期:2017/03/12

6

7 技术要点:

8 1、获取网络地址 直接使用网络地址或下载 注意若下载下来后,要将\转换为/,当然也可以用\\

9 网络地址可以从这里获取:http://cn.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1

10 在返回 的xml页面中(images->image->url)找到具体的图片地址(xml解析),拼接到bing域名后面,构成完整地址

11 注:xml解析用了TinyXml2

12

13 2、转换图片格式(jpg->bmp),本程序中的SystemParametersInfoA函数只支持bmp

14 在程序中自动转换(单单改后缀名是没有用的),转换用的程序是从网上下载的,用C语言编写而成

15 考虑到需要改后缀名,那就直接下载图片好了,顺便存储之

16

17 3、图片保存路径为C:\bingPicture\,格式为.jpg 方便以后浏览

18 注意不保存转换后的bmp格式图片(设置背景后即删除),因为体积较大

19 判断文件夹是否存在,若不存在,则自动创建文件夹

20

21 *未实现的功能*:

22 ***获取每日壁纸的故事(利用bing故事接口) ,更新壁纸后显示在执行框中

23

24 ***开机自启动,并隐藏到托盘中(为减少CPU占用并增加趣味性,设置为开机自动启动,提示网络连接,并输入"go"才执行功能)

25 电脑若未关机,则在24:00自动启动,更换背景

26

27 ***软件自动更新版本功能

28

29 ******************************************************************************************************/

30

31 #include //输入输出

32 #include //文件命名处理需要用字符串

33 #include //调用操作系统各种API

34 #include //获取时间,各种文件命名

35 #include //包含提供下载服务的API

36 #include "tinyxml2.h" //解析XML

37 #include //判断文件夹是否存在

38 #include //创建文件夹

39 extern "C"

40 {

41 #include "jpeg.h" //转换图片格式jpg->bmp 转换格式的程序使用C语言写的

42 }

43

44 //创建本地bingPicture路径和Tmp路径

45 void createDir()

46 {

47 //本地bingPicture路径

48 std::string LocalFolder="C:/bingPicture/";

49

50 if(0!=access(LocalFolder.c_str(),0)) //判断文件夹是否存在,若不存在则创建

51 if(0!=mkdir(LocalFolder.c_str()))

52 std::cout<

53 else

54 std::cout<

55 else

56 std::cout<

57

58 //本地Tmp路径

59 std::string LocalXmlFolder="C:/bingPicture/Tmp/";

60

61 if(0!=access(LocalXmlFolder.c_str(),0)) //判断文件夹是否存在,若不存在则创建

62 if(0!=mkdir(LocalXmlFolder.c_str()))

63 std::cout<

64 else

65 std::cout<

66 else

67 std::cout<

68

69 }

70

71 /**************************************************************************************

72 首先明白一个概念,即string替换所有字符串,将"12212"这个字符串的所有"12"都替换成"21",结果是什么?

73 可以是22211,也可以是21221,有时候应用的场景不同,就会希望得到不同的结果,所以这两种答案都做了实现。

74 **************************************************************************************/

75 //替换字符串方法1(完全轮询,替换一次后接着再次扫描,因为替换一次后可能又出现了满足替换条件的字符串)

76 std::string & replace_all(std::string& str,const std::string& old_value,const std::string& new_value)

77 {

78 while(true) {

79 std::string::size_type pos(0);

80 if((pos=str.find(old_value))!=std::string::npos)

81 str.replace(pos,old_value.length(),new_value);

82 else

83 break;

84 }

85 return str;

86 }

87

88 //替换字符串方法2(只替换一次) 本项目中,只替换\为/用方法2即可

89 std::string & replace_all_distinct(std::string& str,const std::string& old_value,const std::string& new_value)

90 {

91 for(std::string::size_type pos(0); pos!=std::string::npos; pos+=new_value.length())

92 {

93 if((pos=str.find(old_value,pos))!=std::string::npos)

94 str.replace(pos,old_value.length(),new_value);

95 else break;

96 }

97 return str;

98 }

99

100 //获取年月日(命名用)

101 std::string getYearMonthDay()

102 {

103 time_t timer;

104 time(&timer);

105 tm* t_tm = localtime(&timer);

106

107 std::string Year=std::to_string(t_tm->tm_year+1900);

108 std::string Month=std::to_string(t_tm->tm_mon+1);

109 std::string Day=std::to_string(t_tm->tm_mday);

110 std::string PictureName=Year+"_"+Month+"_"+Day;

111

112 return PictureName;

113 }

114

115 //获取图片的Xml并解析图片的url路径

116 std::string getPicTureXmlAndUrl()

117 {

118 //网络上的XML路径

119 std::string WebXmlpath ="http://cn.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1";

120 //本地Xml路径

121 std::string LocalXmlFolder="C:/bingPicture/Tmp/";

122 std::string LocalXmleach=getYearMonthDay();

123 std::string LocalXmlFullpath=LocalXmlFolder+LocalXmleach+".xml";

124

125 if(URLDownloadToFileA(NULL,

126 WebXmlpath.c_str(),

127 LocalXmlFullpath.c_str(),

128 0,

129 NULL)

130 ==S_OK)

131 {

132 std::cout<

133

134 /***************下面开始解析xml中的url路径*******************/

135 tinyxml2::XMLDocument doc;

136 if(tinyxml2::XML_SUCCESS != doc.LoadFile(LocalXmlFullpath.c_str()))

137 std::cout<

138 tinyxml2::XMLElement *images=doc.RootElement();

139 tinyxml2::XMLElement *image =images->FirstChildElement("image");

140

141 //图片Url

142 std::string WebPicturedomain="http://cn.bing.com";

143 std::string WebPictureUrl="";

144

145 if(image!=NULL)

146 WebPictureUrl=image->FirstChildElement("url")->GetText();

147

148 std::string WebPictureFullpath1366x768 =WebPicturedomain+WebPictureUrl;

149 std::cout<

150 /*********************************************************/

151 return WebPictureFullpath1366x768;

152 // //将1366x768换成1920x1080

153 // std::string WebPictureFullpath1920x1080 =replace_all_distinct(WebPictureFullpath1366x768,"1366x768","1920x1080");

154

155 // return WebPictureFullpath1920x1080;

156 }

157 else

158 {

159 std::cout<

160 return "error";

161 }

162

163 }

164

165 //从网络上下载图片并存储到本地

166 std::string getPicture(std::string WebFullpath)

167 {

168 //本地存储路径

169 std::string LocalFolder="C:/bingPicture/";

170 std::string Localeach=getYearMonthDay();

171 std::string LocalFullpath=LocalFolder+Localeach+".jpg";

172

173 if(URLDownloadToFileA(NULL,

174 WebFullpath.c_str(),

175 LocalFullpath.c_str(),

176 0,

177 NULL)

178 ==S_OK)

179 {

180 std::cout<

181

182 /***************下面转换图片格式jpg->bmp******************/

183 //临时文件夹Tmp路径

184 std::string TmpFolder="C:/bingPicture/Tmp/";

185 //.bmp图片路径

186 std::string bmpFolder=TmpFolder+getYearMonthDay()+".bmp";

187 LoadJpegFile(const_cast(LocalFullpath.c_str()),const_cast(bmpFolder.c_str()));

188 /*******************************************************/

189 return bmpFolder;

190 }

191 else

192 {

193 std::cout<

194 return "error";

195 }

196 }

197

198 //改变桌面背景成功后,删除bmp文件和xml文件(只保留jpg文件),此步骤需要小心,避免删除错误路径下的内容

199 void deleteBmpAndXml()

200 {

201 //临时文件夹Tmp路径

202 std::string TmpFolder="C:/bingPicture/Tmp/";

203 //.bmp图片路径

204 std::string bmpFolder=TmpFolder+getYearMonthDay()+".bmp";

205 //xml文件路径

206 std::string xmlFolder=TmpFolder+getYearMonthDay()+".xml";

207

208 if(0==access("C:/bingPicture/Tmp/",0)) //判断文件夹是否存在,若存在则删除

209 {

210 //删除bmp图片

211 if(0==access(bmpFolder.c_str(),0))

212 {

213 if(0==remove(bmpFolder.c_str()))

214 std::cout<

215 else

216 std::cout<

217 }

218 else

219 std::cout<

220

221 //删除xml文件

222 if(0==access(xmlFolder.c_str(),0))

223 {

224 if(0==remove(xmlFolder.c_str()))

225 std::cout<

226 else

227 std::cout<

228 }

229 else

230 std::cout<

231

232 //删除Tmp文件夹(注意此函数只能删除空文件夹,因此要先删除文件夹中的文件)

233 if(0==rmdir(TmpFolder.c_str()))

234 std::cout<

235 else

236 std::cout<

237 }

238 else

239 std::cout<

240

241 }

242

243 //改变桌面背景(PictureFullpath:图片完整路径)

244 void changePicture(std::string PictureFullpath)

245 {

246 bool result=false;

247 result=SystemParametersInfoA(SPI_SETDESKWALLPAPER,

248 0,

249 (PVOID)PictureFullpath.c_str(),

250 0);

251 if(result==false)

252 {

253 std::cout<

254 }

255

256 else

257 {

258 SystemParametersInfoA(SPI_SETDESKWALLPAPER,

259 0,

260 (PVOID)PictureFullpath.c_str(),

261 SPIF_SENDCHANGE);

262 //deleteBmpAndXml(); //windows8及其以上会变成黑色,把这条语句放到main最后面就没问题,具体原因未知

263 system("cls");

264 std::cout<

265 std::cout<

266 std::cout<

267 }

268 }

269

270 int main()

271 {

272 std::string startOrder="";

273 std::cout<

274 std::cout<

275 std::cout<

276 std::cin>>startOrder;

277 while("go"!=startOrder)

278 {

279 std::cout<

280 std::cin>>startOrder;

281 }

282 if("go"==startOrder)

283 {

284 createDir();

285 changePicture(getPicture(getPicTureXmlAndUrl()));

286 }

287

288 /*******************************以下为个性化字幕输出,与程序核心功能无关************************/

289 std::string umua0=" ** ** ******** ******* ******* *** *** ";

290 std::string umua1=" ** ** ******** ******* ******* *** *** ";

291 std::string umua2=" ** ** ** ** ** ** *** ** *** *** ";

292 std::string umua3=" ** ** ** ** ** ** *** ** ** ** ";

293 std::string umua4=" ********* ******** ******* ******* * * ";

294 std::string umua5=" ********* ******** ******* ** ** ";

295 std::string umua6=" ** ** ** ** ** ** ** ";

296 std::string umua7=" ** ** ** ** ** ** ** ";

297 std::string umua8=" ** ** ** ** ** ** ** ";

298 std::string umua9=" ** ** ** ** ** ** ** ";

299

300 #define mua(n) std::cout<

301 std::cout<<:endl>

302 mua(0);mua(1);mua(2);mua(3);mua(4);mua(5);mua(6);mua(7);mua(8);mua(9);

303 std::cout<<:endl>

304 system("pause");

305 /******************************************************************************************/

306 deleteBmpAndXml();

307 return 0;

308 }

图片格式转换程序(这个是网上下载的C源码,我改了一下接口,在此感谢)

jpeg.h

 View Code

jpeg2bmp.c

 View Code

xml解析,我用的是TinyXml2开源库,这个就不贴源码了。

关于Qt项目图标制作

我用的Qt版本是4.8.5。

步骤如下:

在Qt工程目录下新建一个文本文件,并将其名称改为 *.rc (名字任取)

将你的图标文件.ico添加到项目中

打开该 rc 文件,在该rc文件里面加入以下一行文本(将文本中的*换成你的图标的名字):

IDI_ICON ICON DISCARDABLE "*.ico"

在项目文件.pro中加入以下文本(将*换成你的rc文件名字):

RC_FILE = \

*.rc

5. 重新编译工程即可

关于Qt项目的发布

Qt项目发布最麻烦的就是动态依赖库,常用的工具是hap-depends,它可以查看软件的依赖库(*.dll),直接用它打开你的.exe文件,查看缺失哪些.dll文件,找到它们后和exe放在相同目录即可。

当然,发布之前需要经过多个平台的测试。

最后祝大家生活愉快!

java的jna电脑桌面背景_获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)...相关推荐

  1. 【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景

    众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...

  2. java jsp取静态常量_获取java静态

    Android NDK开发系列教程4:对类变量进行操作 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们 ...

  3. php提取bing背景,php获取Bing美图

    微软的必应搜索的每日图片不得不说,都是经典,美得一塌糊涂. 看到很多把必应壁纸做电脑壁纸的软件,今天闲的蛋疼,就折腾了一下. 接口 我们用到的接口是https://cn.bing.com/HPImag ...

  4. Python3爬取Bing每日图片,并设置为电脑桌面

    文章目录 1 - 简述 2 - 核心代码 2.1 - 爬取BingImage 2.2 - 设置为桌面 2.3 - 设置为每日自动执行 3 - 完整代码 4 - 运行结果 作为鄙视链底层的"脚 ...

  5. JAVA将Excel中的报表导出为图片格式(一)问题背景

    如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...

  6. html根据PC手机设置不同背景图,Html-根据不同的分辨率设置不同的背景图片

    @media only screen and (min-width: 1024px)     //当分辨率width >= 1024px 时使用1.jpg作为背景图片 { .bg{ backgr ...

  7. python实现将图片添加水印并设置为桌面背景

    代码可以直接使用的(所需的包都存在的情况下  python v 3.6+ ) 注意代码中的路径信息 # 给图片添加水印并设置为桌面壁纸 import PIL import time import os ...

  8. 【CSS】滑动门技术 ( 借助 CSS 精灵技术实现 | 外部标签设置左半部分背景图片 | 内部标签设置右半部分背景图片 | 鼠标经过更换背景 | 代码示例 )

    文章目录 一.滑动门技术 1.滑动门技术借助 CSS 精灵技术实现 2.外部标签设置左半部分背景图片 3.内部标签设置右半部分背景图片 4.鼠标经过时更换背景 二.完整代码示例 一.滑动门技术 1.滑 ...

  9. java当前时间推前三个月_获取当前时间的前三个月 java

    java获取当前路径的几种方法 1.利用System.getProperty()函数获取当前路径:  System.out.println(System.getProperty("user. ...

最新文章

  1. 视频直播技术详解(1)采集
  2. Angular2.0 基础: Form
  3. git 放弃本地修改,强制拉取更新
  4. 广州学车科目三路考操作步骤要领
  5. Java Short类hashCode()方法及示例
  6. 考研编程练习----畅通工程
  7. 剑指Offer之和为S的连续正数序列
  8. php 身份认证 claim,在ASP.NET Core中实现一个Token base的身份认证实例
  9. 简单的数据库造数据方法
  10. 用project做项目计划及总结报表
  11. 数学速算法_计算总是出算?小学数学常用的25种快速口算窍门,学好算数必备...
  12. Win10注销在哪?怎么注销电脑
  13. iOS:多效果的CategoryView
  14. Android 底层知识拾零,字节跳动Android高级工程师
  15. observable.map 介绍
  16. C语言一秒钟看懂for循环和while循环的用法?
  17. 文梳理世界11国家和地区ICO政策:监管趋严,展现定义证券倾向
  18. 自适应对消算法c语言,LMS自适应对消算法
  19. 悟空crm 进销存功能展示 配图
  20. 【原创】【婚前必读】《女人这东西》(《男》姐妹篇)BY:渡边淳一

热门文章

  1. Lumerical MODE solution FBG光栅透射谱的仿真,官网fbg.lms例子的详解
  2. android : 小米手机 打开开发者 选项 PC 端 安装 apk
  3. 【Shell】Shell 脚本自动输入密码的三种方式
  4. NS-3教程(2):NS-3简单介绍
  5. OpenOCD failed tor read memory at $addr 错误
  6. NoSQL 一致性[详解]更新一致性
  7. 台式机+无线路由 配置 wifi热点
  8. html实现微信公众号,H5在微信公众号的下拉刷新实现
  9. win10蓝牙故障无法正常使用的有效解决方法
  10. 互联网医院源码|互联网医院软件体现智慧医疗的优势