Tuesday, November 09, 2004

 

How to set wall paper

更改桌面图片有两种方法:

方法一:使用WINAPI函数SystemParametersInfo
我们先来看看SystemParametersInfo函数的定义和参数:

  使用API函数之前必须先在程序中声明如下:
  Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long

  其中各参数的意义如下表:

参数: 意义
uAction Long,指定要设置的参数。参考uAction常数表
uParam Long,参考uAction常数表
lpvParam Any,按引用调用的Integer、Long和数据结构。
fuWinIni 这个参数规定了在设置系统参数的时候,是否应更新用户设置参数

  下面是部分uAction参数,和使用它们的方法:

参数 意义和使用方法
6 设置视窗的大小,SystemParametersInfo(6, 放大缩小值, P, 0),lpvParam为long型
17 开关屏保程序,SystemParametersInfo(17, False, P, 1),uParam为布尔型
13,24 改变桌面图标水平和垂直间距,uParam为间距值(像素),lpvParam为long型
15 设置屏保等待时间,SystemParametersInfo(15, 秒数, P, 1),lpvParam为long型
20 设置桌面背景墙纸,SystemParametersInfo(20, True, 图片路径, 1)
93 开关鼠标轨迹,SystemParametersInfo(93, 数值, P, 1),uParam为False则关闭
97 开关Ctrl+Alt+Del窗口,SystemParametersInfo(97, False, A, 0),uParam为布尔型

  本例中我们选择图片并取得图片的完整路径,然后通过调用API函数,将这幅图设为墙纸,使用的语法为:SystemParametersInfo SPI_SETDESKWALLPAPER, 0, bmpfile, 1

  其中SystemParametersInfo表示要设置桌面墙纸,bmpfile是要设置的图片的路径。(按:我也在自己的程序了实现了这个应用,真的很方便。:em222:)

而设置桌面背景的平铺、拉伸、居中可以从注册表直接控制

http://www.china-askpro.com/msg15/qa64.shtml

方法就是在调用SystemParametersInfo修改桌面背景之前, 修改注册表的以下设定值:
HKEY_CURRENT_USER\Control Panel\Desktop\TileWallpaper
HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperStyle
这两个设定值的意义如下:

TileWallpaper的设定值 WallpaperStyle的设定值 显示方式
"0" "0" 居中
"0" "2" 平铺
"1" - 拉伸
注:所谓「拉伸」是当图片与萤幕不等大时, 将图片调整成与萤幕等大小, 这是Windows 98 新增的功能, 但如果您的机器安装有 IE 4.x, 则 Windows 95 也具备相同的功能。调用SystemParametersInfo是为了使修改立即生效。

方法二:使用IActiveDesktop接口函数SetWallPaper。

SystemParametersInfo函数使用简单方便,但它也有缺陷,就是它只能更改桌面图片为bmp格式,而不能将jpg格式图片设置为桌面。原因是它主要用在标准模式桌面中,即非Active Desktop模式。
SystemParametersInfo函数使用方法如下:
TCHAR szBuf[MAX_PATH];
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (void*)szBuf,
SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
SystemParametersInfo函数根据第一个参数的不同,还有许多其他功能,这里就不赘述了,感兴趣的朋友可以到MSDN中看相应的说明。

SetWallPaper函数使用也很方便,但是在使用之前需要做一些前期工作。它可以在Active Desktop模式桌面下将jpg格式的图片设置为桌面。

SetWallPaper函数的使用方法如下:
1。在你的工程初始化代码中加入如下初始化代码段:
IActiveDesktop* pIActiveDesktop;
pIActiveDesktop = NULL;
CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
IID_IActiveDesktop, (void**) &pIActiveDesktop);
2。千万不要忘记在工程退出阶段加入如下释放代码段:
if (pIActiveDesktop != NULL)
{
pIActiveDesktop->Release();
pIActiveDesktop = NULL;
}

3。现在开始真正设置桌面,代码如下:
WALLPAPEROPT wpOptions;
COMPONENTSOPT compOptions;
compOptions.dwSize = sizeof(COMPONENTSOPT);
compOptions.fActiveDesktop = TRUE;
compOptions.fEnableComponents = TRUE;
pIActiveDesktop->SetDesktopItemOptions(&compOptions, 0);

SetDesktopItemOptions函数通过compOptions结构中成员的值设定是否显示桌面项目和是否激活Active Desktop。

wpOptions.dwSize = sizeof(WALLPAPEROPT);
wpOptions.dwStyle = WPSTYLE_TILE;
pIActiveDesktop->SetWallpaperOptions(&wpOptions, 0);

SetWallpaperOptions函数通过wpOptions结构中的成员值设定桌面图片显示的位置,就是我们都很熟悉的平铺、居中和拉伸。

pIActiveDesktop->SetWallpaper(T2CW(szBuf), 0);//设置桌面图片
pIActiveDesktop->ApplyChanges(AD_APPLY_ALL);//应用桌面

这方面的一个不错的例子可以参见:
wallpaperQ: A wallpaper Management Tool
http://www.codeproject.com/tools/wallpaperq.asp?target=wallpaper

9/10/2004补充
下面是zwvista封装的简单函数
from http://blog.csdn.net/foxmail/archive/2004/06/25/26552.aspx

//strPicFile是图像文件名,支持BMP JPEG GIF等格式
//dwStyle是墙纸的样式
//WPSTYLE_CENTER 居中 0
//WPSTYLE_TILE 平铺 1
//WPSTYLE_STRETCH 拉伸 2
//WPSTYLE_MAX 3
//返回值是TRUE时墙纸设置成功,返回FALSE时失败
BOOL SetWallpaper(CString &strPicFile, DWORD dwStyle)
{
HRESULT hr;
IActiveDesktop* pIAD;
//创建接口的实例
hr = CoCreateInstance ( CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
IID_IActiveDesktop, (void**) &pIAD );
if(!SUCCEEDED(hr)) return FALSE;
//将文件名改为宽字符串,这是IActiveDesktop::SetWallpaper的要求
WCHAR wszWallpaper [MAX_PATH];
LPTSTR lpStr = strPicFile.GetBuffer(strPicFile.GetLength() );
MultiByteToWideChar(CP_ACP, 0, lpStr, -1, wszWallpaper, MAX_PATH);
strPicFile.ReleaseBuffer();
//设置墙纸
hr = pIAD->SetWallpaper(wszWallpaper, 0);
if(!SUCCEEDED(hr)) return FALSE;
//设置墙纸的样式
WALLPAPEROPT wpo;
wpo.dwSize = sizeof(wpo);
wpo.dwStyle = dwStyle;
hr = pIAD->SetWallpaperOptions(&wpo, 0);
if(!SUCCEEDED(hr)) return FALSE;
//应用墙纸的设置
hr = pIAD->ApplyChanges(AD_APPLY_ALL);
if(!SUCCEEDED(hr)) return FALSE;
//读取墙纸的文件名并打印在debug窗口内
hr = pIAD->GetWallpaper(wszWallpaper, MAX_PATH, 0);
CString strFile = wszWallpaper;
TRACE(strFile); //如果不用位图的话,这里有你意想不到的发现
//释放接口的实例
pIAD->Release();
return TRUE;
}

在MFC程序中应用此函数时,须注意以下三点。

1.在函数所在文件中加上声明IActiveDesktop的头文件

#include

2.在StdAfx.h中插入#include
位置不能搞错,否则IActiveDesktop将找不到定义

#include // MFC core and standard components
#include // NOTE: corrects compilation errors w/IActiveDesktop!!
#include // MFC extensions

3.由于此函数引用了COM组件,所以必须在C**App::OnInitInstance()中插入以下语句,初始化COM组件。

AfxOleInit();

补充:

只有在安装了IE4.0及以上版本时才能应用IActiveDesktop接口,只有在打开active desktop(活动桌面)的情况下才能应用SetWallpaper函数,下面是启用或关闭active desktop的函数:

//bEnable是TRUE时启用active desktop, 是FALSE时关闭
//返回值是TRUE时启用或关闭active desktop成功,返回FALSE时失败
BOOL EnableActiveDesktop(BOOL bEnable)
{
HRESULT hr;
IActiveDesktop* pIAD;
//创建接口的实例
hr = CoCreateInstance ( CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
IID_IActiveDesktop, (void**) &pIAD );
if(!SUCCEEDED(hr)) return FALSE;
COMPONENTSOPT comp;
comp.dwSize = sizeof(comp);
comp.fEnableComponents = bEnable;
//启用或关闭active desktop
comp.fActiveDesktop = bEnable;
hr = pIAD->SetDesktopItemOptions(&comp, 0);
if(!SUCCEEDED(hr)) return FALSE;
//释放接口的实例
pIAD->Release;
return TRUE;
}

补充1/25/2005

文章来源:互联网 文章作者:未知


此一问题需调用 SystemParametersInfo API 函数,细节如下:
1. API 的声明:
Const SPI_SETDESKWALLPAPER = 20
Const SPIF_UPDATEINIFILE = &H1
Private Declare Function SystemParametersInfo Lib "user32" Alias "
SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long,
ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
注:如果以上的声明放在「一般模块」底下, 应在 Const 之前加上 Public 保留
字, 并且将 Private 保留字去掉。
2. 程序范例:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, BMP图档名称,
SPIF_UPDATEINIFILE)
例如:
' 1. 将桌面图片设定成 c:\windows\setup.bmp
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp
", SPIF_UPDATEINIFILE)
' 2. 将桌面图片清掉
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "",
SPIF_UPDATEINIFILE)
程序如下:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, BMP图档名称,
SPIF_UPDATEINIFILE)
例如:
' 1. 将桌面图片设定成 c:\windows\setup.bmp
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp
", SPIF_UPDATEINIFILE)
' 2. 将桌面图片清掉
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "",
SPIF_UPDATEINIFILE)
但以上程序设定图片之后, 必须等到下次 Windows 重新启动时才生效, 如果希
望设定之后立刻生效,则程序须修改如下:
Const SPIF_SENDWININICHANGE = &H2
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp
", SPIF_UPDATEINIFILE + SPIF_SENDWININICHANGE )
此外希望只有本次使用 Windows 时改变桌面图片(下次开机时还原原状), 则程序
如下:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp
", SPIF_SENDWININICHANGE ) ' 去掉 SPIF_UPDATEINIFILE

9/9/2005 补充

A more complex approach
http://www.codeproject.com/tools/wallpaperq.asp



<< Home

This page is powered by Blogger. Isn't yours?