通过搜狐微博的api,使用http basic 认证,新浪的oauth还要通过浏览器认证,太麻烦,整个程序分为几个小部分,不难。
实现以下功能:
1,开机启动。程序运行有会创建C:\bgimg文件夹,会将程序自己copy到该文件夹下,以后开机启动将用该文件夹下的程序。下载的壁纸也在该文件夹下。
2,自动更新壁纸。
3,从搜狐微博获取图片链接,下载图片。
4,md5验证,用于比较当前的壁纸与下载的壁纸是否相同。
5,隐藏窗口,后台运行,不需要窗口滴。
6,图片格式转换,xp系统下调用SystemParametersInfo更改壁纸,只支持bmp格式的。这里注意,上传的图片也要是bmp格式的。
代码中用到了搜狐微博提供的封装好的C#.net类,使用很简单。该类库下载地址:
http://www.iiidown.com/source_link.php?type=1&key=71510353&url=http%3A%2F%2Fdlwt.csdn.net%2Ffd.php%3Fi%3D751826827284012%26s%3D025045b263981a9e346d83067b6b9d3c
下面贴上代码:
using
System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Net;
using System.Drawing.Imaging;
using web.ApiService; //搜狐api类库。
namespace client_souhu
{
public partial class main : Form
{
[DllImport( " user32.dll " , EntryPoint = " SystemParametersInfo " )]
public static extern int SystemParametersInfo1(
int uAction,
int uParam,
string lpvParam,
int fuWinIni
);
[DllImport( " user32.dll " , CharSet = CharSet.Auto, SetLastError = true )]
static extern bool SystemParametersInfo( uint uAction, uint uParam, StringBuilder lpvParam, uint init);
const uint SPI_GETDESKWALLPAPER = 0x0073 ;
string localPath = @" c:\bgimg\ " ; // 创建文件夹的路径。
string localFilename = " 1.bmp " ; // 下载下来图片的文件名。
string mainName = " wallpaper.exe " ; // 主程序的名字。
string lastThemesPaperMd5 = "" ; // 保存最近一次图片的md5。这里实现有问题,可以不用管先。
string lastBgimgPaperMd5 = "" ; // 最近上一次下载图片的md5.
string tmpFileName = " 1.jpg " ;
bool downloadingImg = false ; // 该值为true时表示正在下载图片,暂停切换壁纸。
string weiboCreateTime; // 微博的创建时间,用于判断图片微博是否更新,从而判断是否要下载图片。
// 搜狐微博账号信息。
// 在微博上传图片时,微博的内容为imgBz内容,程序根据这个标志,下载图片。对于xp用户,上传的图片必须为.bmp格式的。
// 只要在最近20条微博中,有带有imgBz标志的图片微博,就可以更换壁纸
string username = " 你的微博账号 " ;
string passwd = " 你的微博密码 " ;
string imgBz = " wp_public " ; // 不同的人用不同的标志,下载不同的图片,该标志自定义
public main()
{
InitializeComponent();
}
private void Form1_Load( object sender, EventArgs e)
{
updateSelf();
autoRun();
// 单独线程。
Thread updateImgThread = new Thread( new ThreadStart(updateImg));
updateImgThread.Start();
Thread downloadImgThread = new Thread( new ThreadStart(downloadImg));
downloadImgThread.Start();
}
// 更新图片
private void updateImg()
{
Thread.CurrentThread.IsBackground = true ;
StringBuilder wallPaperPath = new StringBuilder( 200 );
SystemParametersInfo(SPI_GETDESKWALLPAPER, 200 , wallPaperPath, 0 );
while ( true )
{
if (File.Exists(localPath + localFilename) && ! downloadingImg)
{
string x = getMD5Hash(wallPaperPath.ToString());
string y = getMD5Hash(localPath + localFilename);
if (x != lastThemesPaperMd5 || y != lastBgimgPaperMd5)
{
SystemParametersInfo1( 20 , 0 , localPath + localFilename, 1 );
lastThemesPaperMd5 = x;
lastBgimgPaperMd5 = y;
// MessageBox.Show("change Paper:Themes");
}
}
Thread.Sleep( 5000 );
}
}
// 从微博下载图片。
private void downloadImg()
{
Thread.CurrentThread.IsBackground = true ;
WebClient wc = new WebClient();
while ( true )
{
try
{
List < Status > getInfo = ApiService.FriendsTimeline(username,passwd, 1 );
Status firstImg = getInfo.Find(text =>
{
if (text.text.ToLower() == imgBz.ToLower())
{
return true ;
}
return false ;
}
);
if (firstImg != null && firstImg.created_at.ToString() != weiboCreateTime || ! File.Exists(localPath + localFilename))
{
downloadingImg = true ;
string imgUrl = firstImg.original_pic;
wc.DownloadFile(imgUrl, localPath + tmpFileName);
formatImg(localPath + tmpFileName);
weiboCreateTime = firstImg.created_at.ToString();
wc.Dispose();
File.Delete(localPath + tmpFileName);
downloadingImg = false ;
}
}
catch (Exception ex)
{
// MessageBox.Show("downloadImg()"+ex.Message);
}
Thread.Sleep( 30000 );
}
}
// 设置开机自启动。
private void autoRun()
{
string path = localPath + mainName;
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.CurrentUser;
Microsoft.Win32.RegistryKey rk2 = rk.CreateSubKey( @" Software\Microsoft\Windows\CurrentVersion\Run " );
rk2.SetValue( " MyPaper " , path);
rk2.Close();
rk.Close();
}
// 获取文件md5.
private string getMD5Hash( string pathName)
{
string strResult = "" ;
string strHashData = "" ;
byte [] arrbytHashValue;
System.IO.FileStream oFileStream = null ;
System.Security.Cryptography.MD5CryptoServiceProvider oMD5Hasher = new System.Security.Cryptography.MD5CryptoServiceProvider();
try
{
oFileStream = new System.IO.FileStream(pathName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
arrbytHashValue = oMD5Hasher.ComputeHash(oFileStream); // 计算指定Stream 对象的哈希值
oFileStream.Close();
// 由以连字符分隔的十六进制对构成的String,其中每一对表示value 中对应的元素;例如“F-2C-4A”
strHashData = System.BitConverter.ToString(arrbytHashValue);
// 替换-
strHashData = strHashData.Replace( " - " , "" );
strResult = strHashData;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
return strResult;
}
// 更新程序。
private void updateSelf()
{
DirectoryInfo di = new DirectoryInfo(localPath);
if ( ! di.Exists)
{
di.Create();
}
try
{
if (Application.ExecutablePath != localPath + mainName)
{
File.Copy(Application.ExecutablePath, localPath + mainName, true ); // 更新文件。
}
}
catch (Exception ex)
{
//
}
}
// 隐藏窗口
private bool windowCreate = true ;
protected override void OnActivated(EventArgs e)
{
if (windowCreate)
{
base .Visible = false ;
windowCreate = false ;
}
base .OnActivated(e);
}
// 转换图片为bmp格式。
private void formatImg( string file)
{
using (StreamReader sr = new StreamReader(file))
{
Stream streamReceive = sr.BaseStream;
Image img = new Bitmap(streamReceive);
// System.Drawing.Bitmap bmp = new Bitmap(img.Size.Width, img.Size.Height, img.PixelFormat);
System.Drawing.Bitmap bmp;
if (file.ToLower().EndsWith( " .gif " ))
{
bmp = new Bitmap(img.Size.Width, img.Size.Height, PixelFormat.Format24bppRgb);
}
else
{
bmp = new Bitmap(img.Size.Width, img.Size.Height, img.PixelFormat);
}
bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);
g.DrawImage(img, 0 , 0 );
g.Flush();
g.Save();
g.Dispose();
try
{
bmp.Save(file.ToLower().Replace( " .jpg " , " .bmp " ).Replace( " .jpeg " , " .bmp " ).Replace( " .gif " , " .bmp " ).Replace( " .png " , " .bmp " ), System.Drawing.Imaging.ImageFormat.Bmp);
}
catch (Exception ex)
{
}
finally
{
img.Dispose();
}
}
}
}
}
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Net;
using System.Drawing.Imaging;
using web.ApiService; //搜狐api类库。
namespace client_souhu
{
public partial class main : Form
{
[DllImport( " user32.dll " , EntryPoint = " SystemParametersInfo " )]
public static extern int SystemParametersInfo1(
int uAction,
int uParam,
string lpvParam,
int fuWinIni
);
[DllImport( " user32.dll " , CharSet = CharSet.Auto, SetLastError = true )]
static extern bool SystemParametersInfo( uint uAction, uint uParam, StringBuilder lpvParam, uint init);
const uint SPI_GETDESKWALLPAPER = 0x0073 ;
string localPath = @" c:\bgimg\ " ; // 创建文件夹的路径。
string localFilename = " 1.bmp " ; // 下载下来图片的文件名。
string mainName = " wallpaper.exe " ; // 主程序的名字。
string lastThemesPaperMd5 = "" ; // 保存最近一次图片的md5。这里实现有问题,可以不用管先。
string lastBgimgPaperMd5 = "" ; // 最近上一次下载图片的md5.
string tmpFileName = " 1.jpg " ;
bool downloadingImg = false ; // 该值为true时表示正在下载图片,暂停切换壁纸。
string weiboCreateTime; // 微博的创建时间,用于判断图片微博是否更新,从而判断是否要下载图片。
// 搜狐微博账号信息。
// 在微博上传图片时,微博的内容为imgBz内容,程序根据这个标志,下载图片。对于xp用户,上传的图片必须为.bmp格式的。
// 只要在最近20条微博中,有带有imgBz标志的图片微博,就可以更换壁纸
string username = " 你的微博账号 " ;
string passwd = " 你的微博密码 " ;
string imgBz = " wp_public " ; // 不同的人用不同的标志,下载不同的图片,该标志自定义
public main()
{
InitializeComponent();
}
private void Form1_Load( object sender, EventArgs e)
{
updateSelf();
autoRun();
// 单独线程。
Thread updateImgThread = new Thread( new ThreadStart(updateImg));
updateImgThread.Start();
Thread downloadImgThread = new Thread( new ThreadStart(downloadImg));
downloadImgThread.Start();
}
// 更新图片
private void updateImg()
{
Thread.CurrentThread.IsBackground = true ;
StringBuilder wallPaperPath = new StringBuilder( 200 );
SystemParametersInfo(SPI_GETDESKWALLPAPER, 200 , wallPaperPath, 0 );
while ( true )
{
if (File.Exists(localPath + localFilename) && ! downloadingImg)
{
string x = getMD5Hash(wallPaperPath.ToString());
string y = getMD5Hash(localPath + localFilename);
if (x != lastThemesPaperMd5 || y != lastBgimgPaperMd5)
{
SystemParametersInfo1( 20 , 0 , localPath + localFilename, 1 );
lastThemesPaperMd5 = x;
lastBgimgPaperMd5 = y;
// MessageBox.Show("change Paper:Themes");
}
}
Thread.Sleep( 5000 );
}
}
// 从微博下载图片。
private void downloadImg()
{
Thread.CurrentThread.IsBackground = true ;
WebClient wc = new WebClient();
while ( true )
{
try
{
List < Status > getInfo = ApiService.FriendsTimeline(username,passwd, 1 );
Status firstImg = getInfo.Find(text =>
{
if (text.text.ToLower() == imgBz.ToLower())
{
return true ;
}
return false ;
}
);
if (firstImg != null && firstImg.created_at.ToString() != weiboCreateTime || ! File.Exists(localPath + localFilename))
{
downloadingImg = true ;
string imgUrl = firstImg.original_pic;
wc.DownloadFile(imgUrl, localPath + tmpFileName);
formatImg(localPath + tmpFileName);
weiboCreateTime = firstImg.created_at.ToString();
wc.Dispose();
File.Delete(localPath + tmpFileName);
downloadingImg = false ;
}
}
catch (Exception ex)
{
// MessageBox.Show("downloadImg()"+ex.Message);
}
Thread.Sleep( 30000 );
}
}
// 设置开机自启动。
private void autoRun()
{
string path = localPath + mainName;
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.CurrentUser;
Microsoft.Win32.RegistryKey rk2 = rk.CreateSubKey( @" Software\Microsoft\Windows\CurrentVersion\Run " );
rk2.SetValue( " MyPaper " , path);
rk2.Close();
rk.Close();
}
// 获取文件md5.
private string getMD5Hash( string pathName)
{
string strResult = "" ;
string strHashData = "" ;
byte [] arrbytHashValue;
System.IO.FileStream oFileStream = null ;
System.Security.Cryptography.MD5CryptoServiceProvider oMD5Hasher = new System.Security.Cryptography.MD5CryptoServiceProvider();
try
{
oFileStream = new System.IO.FileStream(pathName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
arrbytHashValue = oMD5Hasher.ComputeHash(oFileStream); // 计算指定Stream 对象的哈希值
oFileStream.Close();
// 由以连字符分隔的十六进制对构成的String,其中每一对表示value 中对应的元素;例如“F-2C-4A”
strHashData = System.BitConverter.ToString(arrbytHashValue);
// 替换-
strHashData = strHashData.Replace( " - " , "" );
strResult = strHashData;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
return strResult;
}
// 更新程序。
private void updateSelf()
{
DirectoryInfo di = new DirectoryInfo(localPath);
if ( ! di.Exists)
{
di.Create();
}
try
{
if (Application.ExecutablePath != localPath + mainName)
{
File.Copy(Application.ExecutablePath, localPath + mainName, true ); // 更新文件。
}
}
catch (Exception ex)
{
//
}
}
// 隐藏窗口
private bool windowCreate = true ;
protected override void OnActivated(EventArgs e)
{
if (windowCreate)
{
base .Visible = false ;
windowCreate = false ;
}
base .OnActivated(e);
}
// 转换图片为bmp格式。
private void formatImg( string file)
{
using (StreamReader sr = new StreamReader(file))
{
Stream streamReceive = sr.BaseStream;
Image img = new Bitmap(streamReceive);
// System.Drawing.Bitmap bmp = new Bitmap(img.Size.Width, img.Size.Height, img.PixelFormat);
System.Drawing.Bitmap bmp;
if (file.ToLower().EndsWith( " .gif " ))
{
bmp = new Bitmap(img.Size.Width, img.Size.Height, PixelFormat.Format24bppRgb);
}
else
{
bmp = new Bitmap(img.Size.Width, img.Size.Height, img.PixelFormat);
}
bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);
g.DrawImage(img, 0 , 0 );
g.Flush();
g.Save();
g.Dispose();
try
{
bmp.Save(file.ToLower().Replace( " .jpg " , " .bmp " ).Replace( " .jpeg " , " .bmp " ).Replace( " .gif " , " .bmp " ).Replace( " .png " , " .bmp " ), System.Drawing.Imaging.ImageFormat.Bmp);
}
catch (Exception ex)
{
}
finally
{
img.Dispose();
}
}
}
}
}