用SystemParametersInfo设置桌面背景时,发现一个奇怪的问题,如果在程序中改变Bitmap文件的大小,再调用该API函数后没有效果,桌面为蓝色。改变大小后的BMP文件,即使在桌面点击右键->属性->显示属性窗口->桌面选项里手动设置也不会显示,桌面还为蓝色。
代码如下:
fileName = wallpaperOpenFileDialog.FileName; System.Drawing.Bitmap bmp = new Bitmap(fileName); System.Drawing.Bitmap img = new Bitmap(bmp, 600, 400); //缩小图片 fileName = @"C:/Documents and Settings/bill/Local Settings/Application Data/Microsoft/WallPaper.bmp"; if (System.IO.File.Exists(fileName)) System.IO.File.Delete(fileName); img.Save(fileName); int result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, fileName, SPIF_UPDATEINIFILE ¦ SPIF_SENDWININICHANGE); int error = GetLastError();
问题的原因似乎是改变图片大小的过程中,像PixelFormat,Flags等等属性也被改变了,丢失了一些数据,而图片作为墙纸需要某些和像素相关的信息。
解决的方法是个不是方法的方法: 先把该Bitmap对象保存为Jpg文件,再读取Jpg文件,另存为BMP文件,最后SystemParametersInfo函数调用该BMP文件设置墙纸。