使用的API原型是 BOOL SystemParametersinfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni);

在C#中定义如下:

 /// <summary>
/// 查询或设置系统级参数
/// </summary>
/// <param name="uAction"></param>
/// <param name="uParam"></param>
/// <param name="lpvParam"></param>
/// <param name="fuWinIni"></param>
/// <example></example>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern int SystemParametersInfo(UAction uAction, int uParam, StringBuilder lpvParam, int fuWinIni);

其中UAction类型的参数定义为:

 public enum UAction
{
/// <summary>
/// 设置桌面背景图片
/// </summary>
SPI_SETDESKWALLPAPER = 0x0014,
/// <summary>
/// 获取桌面背景图片
/// </summary>
SPI_GETDESKWALLPAPER = 0x0073,
}

首先是获取桌面背景,调用方法:

 public string GetBackgroud()
{
StringBuilder s = new StringBuilder();
APIHelper.SystemParametersInfo(UAction.SPI_GETDESKWALLPAPER, , s, );
return s.ToString();
}

再是设置桌面背景:

 /// <summary>
/// 设置桌面背景
/// </summary>
/// <param name="fileName">图片绝对路径</param>
/// <returns></returns>
public int SetBackgroud(string fileName)
{
int result = ;
if (File.Exists(fileName))
{
StringBuilder s = new StringBuilder(fileName);
result = APIHelper.SystemParametersInfo(UAction.SPI_SETDESKWALLPAPER, , s, 0x2);
}
return result;
}

返回0表示设置失败,1表示成功。

以上内容网上都能搜到,

但是在使用过程中,发现通过上述的设置方法,虽然能改变桌面背景,但是右键桌面→个性化→桌面背景里的图片并没有改变。

查找资料后,才知道是注册表没有设置。

注册表:HKEY_CURRENT_USER\Control Panel\Desktop

修改里面Wallpaper的值为图片路径即可

相关设置注册表代码如下

 /// <summary>
/// 设置注册表选项
/// </summary>
/// <param name="optionsName">注册表项名称</param>
/// <param name="optionsData">注册表项值</param>
/// <param name="msg"></param>
/// <returns></returns>
public static bool SetOptions(string optionsName, string optionsData, ref string msg)
{
bool returnBool = true;
RegistryKey classesRoot = Registry.CurrentUser;
RegistryKey registryKey = classesRoot.OpenSubKey(@"Control Panel\Desktop", true);
try
{
if (registryKey != null)
{
registryKey.SetValue(optionsName.ToUpper(), optionsData);
}
else
{
returnBool = false;
}
}
catch
{
returnBool = false;
msg = "读取注册表出现异常、";
}
finally
{
classesRoot.Close();
registryKey.Close();
}
return returnBool;
}

注:XP下更换背景只支持BMP格式,需要将jpg文件读取,转换成BMP格式,再设置。

Windows7获取、更换桌面背景,C#的更多相关文章

  1. Mac 更换桌面背景崩溃(闪退)

    更新完系统后就会出现这种情况,,其实就是用户偏好文件出了问题. 1. 在终端输入 cd /Users/YourUserName/Library/Preferences //进入文件夹 rm com.a ...

  2. Win10家庭版设置桌面右键更换桌面壁纸

    Win10家庭版设置桌面右键更换桌面壁纸.. ------------------------- 这是设置之前的右键快捷菜单.. ------------------------- 开始设置:右键桌面 ...

  3. windows 桌面背景设置实例

    应用SystemParametersInfo函数可以获取和设置数量众多的windows系统参数.这个小程序就是运用了SystemParametersInfo函数来设置桌面的墙纸背景,而且程序可以让我们 ...

  4. 找回误删除的UBUNTU16.04桌面壁纸图片,或把桌面背景图片另存。20170114

    今天遇到一个小问题,之前下载并设置为桌面壁纸的一张图片在整理文件的时候不小心删除了.由于想不起来当时从哪里找到的图,所以就想把当前桌面壁纸重新保存.经网上查询,未见正确的保存方法,故写在此处备忘. 1 ...

  5. 如何找出当前活动桌面背景图像的位置/路径(Ubuntu 18.04,GNOME)?

    启动终端并运行以下命令 $ gsettings get org.gnome.desktop.background picture-uri 显示当前设置为桌面背景图片的完整路径.  

  6. Python3实现Win10桌面背景自动切换

    [本文出自天外归云的博客园] 得空写了个自动切换桌面背景图片的小程序.再不写python就要扔键盘了,对vue还有那么一点好感,天天php真是有够烦. 准备工作 准备个文件夹放在桌面上,平时看到什么高 ...

  7. 清除win7桌面背景的图片位置下拉菜单的历史记录

    到注册表 清除win7桌面背景的图片位置下拉菜单的历史记录: 开始--->运行--->输入regedit,在弹出的注册表编辑器中,定位到如下位置 HKEY_CURRENT_USER\Sof ...

  8. win10更换登陆背景和关闭锁屏

    更换登陆背景图 用国外一个hacker写的工具,可在github上下载,或者下载我上传到百度网盘的备份.win10默认的登陆背景太难看了. 去掉锁屏图片 登陆界面其实本身就是一种锁屏,为什么还要单独搞 ...

  9. 利用API设置桌面背景

    实现效果: 知识运用: API函数SystemParametersInfo 实现代码: [DllImport("user32.dll", EntryPoint = "Sy ...

随机推荐

  1. 修改SO

    1.如果在jni中定义的是int型的数据,比如: JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin (JNIEnv * env, job ...

  2. 安装ubuntu+Windows双系统, Windows启动项消失

    这里主要介绍grub分区损坏的问题: 首先介绍最简单的方法, 不确定能不能成功, 但是最好先用此方法, 毕竟最简单如果解决就不用下一个方法了. 1. (1)用U盘做一个ubuntu的镜像, 开机进入U ...

  3. Paint Tree

    题意: 给定一棵n个点的树,给定平面上n个点,将n个点用线段连起来画成树的形状,使得不存在不在端点相交的线段,构造出一种情况. 解法: 首先观察我们常规画出来的树形图可知,树的子树是根据极角分开的,这 ...

  4. Game of Peace

    Time Limit: 4000ms, Special Time Limit:10000ms, Memory Limit:65536KB Total submit users: 20, Accepte ...

  5. 对比<input type="text" id="">和<asp:TextBox runat="server" ID="">

    首先这两个都是对应文本输入框形式: <input type="text"class="form-control"id="txt_add_pro_ ...

  6. Cpython 解释器下实现并发编程

    背景知识: 顾明思议: 进程即正在执行的一个过程,进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统, 是操作系统最核心的概念,也是操作系统提供的最古老的最重要的抽象概念之一.操作系统的其他所 ...

  7. SQL——登陆触发器实现限制IP

    [转载]原文地址:https://www.baidu.com/link?url=N-SM28ge21TTYky79dYk8otsjKgYCIpy-0RBSvMV25f8KSOsYczhxTOCzeNZ ...

  8. JAVA基础--JAVA API集合框架(其他集合类,集合原理)15

    一.ArrayList介绍 1.ArrayList介绍 ArrayList它是List接口的真正的实现类.也是我们开发中真正需要使用集合容器对象. ArrayList类,它是List接口的实现.肯定拥 ...

  9. Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置

    前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个 ...

  10. 【阿里云IoT+YF3300】1.时代大背景下的阿里云IoT物联网的现状和未来

    “未来十到二十年,大家基本已经形成了一个共识,那便是新格局的奠定将由 AI 和物联网技术来支撑.放眼国内,在这些互联网巨头之中,未来真正成为竞争对手厮杀的,阿里和华为是首当其冲,在这两个领域双方分别暗 ...