在应用程序中如何激活活动桌面ActiveDesktop.docx
- 文档编号:4593988
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:7
- 大小:55.82KB
在应用程序中如何激活活动桌面ActiveDesktop.docx
《在应用程序中如何激活活动桌面ActiveDesktop.docx》由会员分享,可在线阅读,更多相关《在应用程序中如何激活活动桌面ActiveDesktop.docx(7页珍藏版)》请在冰豆网上搜索。
在应用程序中如何激活活动桌面ActiveDesktop
问题:
在应用程序中如何激活活动桌面(ActiveDesktop)?
一般情况下用户可以在桌面单击右键,选择“活动桌面”=〉“按Web页查看”来打开/关闭活动桌面特性。
有没有什么函数可以程序中调用来实现对活动桌面的操作?
另外,如何断定用户激活或取消活动桌面?
解答:
在回答这个问题之前,让我给你一个重要警告。
那就是如果你打算开关活动桌面特性,请保证经过了用户的许可!
最好使用大字体清晰地显示:
“你真的想要激活活动桌面吗?
”要是没有这样的提示,对用户不免有些粗鲁。
有些用户并不想要什么程序来决定是否启动活动桌面。
如果用户真要是喜欢Web特性而不想失去活动桌面。
那他们也会容忍由此而带来的性能下降。
好吧,这么多严厉的警告。
现在假设你有充足的理由打开或关闭活动桌面。
也许你在写一个新的外壳。
为了激活或取消活动桌面,你需要使用IActiveDesktop,这是个活动桌面的COM接口。
下面列出的是这个接口的方法列表:
//
IActiveDesktop接口方法表
方法
功能和用途
AddDesktopItem
添加一个桌面项。
AddDesktopItemWithUI
使用某个用户界面添加一个桌面项到活动桌面。
AddUrl
添加与指定的URL关联的桌面项。
ApplyChange
执行对活动桌面的修改。
要使修改生效必须调用这个函数。
用于激活或取消活动桌面。
GenerateDesktopItemHtml
产生包含给定桌面项的通用HTML页面。
GetDesktopItem
获得指定的桌面项。
GetDesktopItemByID
获得与给定ID匹配的桌面项。
GetDesktopItemBySource
用源URL获得某个桌面项。
GetDesktopItemCount
或的桌面项计数。
GetDesktopItemOptions
检查活动桌面是否打开或关闭。
SHGetSettings性能更佳。
用于激活或取消活动桌面。
GetPattern
获取当前使用的式样。
GetWallpaper
获取当前使用的墙纸。
仅用于活动桌面。
标准模式时(桌面关闭),使用SystemParametersInfo。
GetWallpaperOptions
获得墙纸选项。
仅用于活动桌面。
标准模式时(桌面关闭),使用SystemParametersInfo。
ModifyDesktopItem
修改桌面项。
RemoveDesktopItem
从桌面删除指定的桌面项。
SetDesktopItemOptions
打开或关闭活动桌面。
SetPattern
设置活动桌面式样。
SetWallpaper
设置活动桌面墙纸。
仅用于活动桌面。
标准模式时(桌面关闭),使用SystemParametersInfo。
SetWallpaperOptions
设置墙纸选项。
仅用于活动桌面。
标准模式时(桌面关闭),使用SystemParametersInfo。
//
用IActiveDesktop可以添加和删除桌面项(HTML页面,图像,URLs或者ActiveX控件),设置和获取墙纸(仅用于活动桌面,在标准模式时要用SystemParametersInfo函数)及其它有用功能。
你可以用来打开或关闭活动桌面的函数是SetDesktopItemOptions。
但首先要考虑——如何获得IActiveDesktop接口?
用通常使用COM的方法创建一个实例:
//
IActiveDesktop*pAD;
HRESULThr=:
:
CoCreateInstance(
CLSID_ActiveDesktop,
NULL,//不支持聚合,也就是说没有外部Unknown
CLSCTX_INPROC_SERVER,
IID_IActiveDesktop,
(void**)&pAD);
//
不要忘了在启动代码中调用CoInitialize,如MFC应用的InitInstance函数。
一旦你有了ActiveDesktop指针,便可以调用它的方法。
//
//激活活动桌面
COMPONENTSOPTopt;
opt.dwSize=sizeof(opt);
opt.fActiveDesktop=
opt.fEnableComponents=TRUE;
HRESULThr=pAD->SetDesktopItemOptions(&opt,0);
//
现在活动桌面应该被激活,但真是这样吗?
当你第一次运行时,什么事情也没发生。
怎么回事呢?
经过检查,我发现之所以设置没有起作用是因为有个小细节在文档中没有说明——将设置应用到活动桌面:
//
pAD->ApplyChanges(AD_APPLY_REFRESH);
//
用完接口之后不要忘了释放(Release)它!
(当然,你不应该使用原始的接口指针,应该用ATL智能指针——希望你正在使用它们)为了检查活动桌面是否打开或关闭,有一个对应的Get函数——GetDesktopItemOptions,它使用相同的COMPONENTSOPT结构。
还有一个外壳函数做同样的事情:
//
//活动桌面打开或关闭了吗?
SHELLFLAGSTATEshfs;
SHGetSettings(&shfs,SSF_DESKTOPHTML);
BOOLbADEnabled=shfs.fDesktopHTML;
//
不需要COM,CoCreateInstance,IActiveDesktop,或任何有关COM接口的东西。
只要调用这个函数。
你可以用SHGetSettings来检查一系列的外壳设置,下面列出了有关SHGetSettings使用的详细信息。
这些设置或多或少与Windows9x的资源管理器(参见图四)中“查看”=〉“文件夹选项”=〉“查看”标签中的选项对应。
(Windows2000有所不同,它是在“工具”=〉“文件夹选项”=〉“查看”标签中)可惜没用对应的SHSetSettings函数。
//
//用SHGetSettings获得信息
//SHGetSettings获得当前外壳设置
//
VOIDSHGetSettings(
LPSHELLFLAGSTATElpsfs,//下列结构的地址
DWORDdwMask //获取哪个信息(参见下面内容)
);
//SHGetSettings填充下面的位域结构.这些标志与Explorer的“查看”=〉“文件夹选项”=〉“查看”标签中的选项对应
//
typedefstruct{
BOOLfShowAllObjects:
1; //显示所有文件(隐藏的或系统的)
BOOLfShowExtensions:
1; //显示文件扩展名(如.txt)
BOOLfNoConfirmRecycle:
1;//删除时不确认
BOOLfShowSysFiles:
1; //显示文件的系统属性
BOOLfShowCompColor:
1;
BOOLfDoubleClickInWebView:
1;//顾名思义
BOOLfDesktopHTML:
1; //已打开活动桌面
BOOLfWin95Classic:
1; //已打开Windows95"传统"视图
BOOLfDontPrettyPath:
1;
BOOLfShowAttribCol:
1;
BOOLfMapNetDrvBtn:
1; //显示网络驱动器按钮
BOOLfShowInfoTip:
1; //显示弹出式描述
BOOLfHideIcons:
1; //在活动桌面模式中隐藏图标
UINTfRestFlags:
3;
}SHELLFLAGSTATE;
//这些标志被用于获取上面的这些域;如调用时使用:
dwMask=
//(SSF_DESKTOPHTML|SSF_WIN95CLASSIC)来获取fDesktopHTML和
//fWin95Classic。
//
#defineSSF_SHOWALLOBJECTS 0x00000001
#defineSSF_SHOWEXTENSIONS 0x00000002
#defineSSF_SHOWCOMPCOLOR 0x00000008
#defineSSF_SHOWSYSFILES 0x00000020
#defineSSF_DOUBLECLICKINWEBVIEW 0x00000080
#defineSSF_SHOWATTRIBCOL 0x00000100
#defineSSF_DESKTOPHTML 0x00000200
#defineSSF_WIN95CLASSIC 0x00000400
#defineSSF_DONTPRETTYPATH 0x00000800
#defineSSF_SHOWINFOTIP 0x00002000
#defineSSF_MAPNETDRVBUTTON 0x00001000
#defineSSF_NOCONFIRMRECYCLE 0x00008000
#defineSSF_HIDEICONS 0x00004000
图四“查看”/“工具”菜单=〉“文件夹选项”=〉“查看” 现在我们知道由两种方法来检查是否活动桌面是否激活——SHGetSettings和IActiveDesktop:
:
GetDesktopItemOptions,哪个方法好呢?
这很重要吗?
为了回答这个问题,让我们来探讨问题中的第二部分:
如何断定用户激活或取消活动桌面,不论是从桌面菜单或者是从属性对话框(如图五)?
图五选择活动桌面 当用户打开或关闭活动桌面时,Windows广播WM_SETTINGCHANGE消息给所有最上层窗口,消息值分别为:
wParam=0和lParam="ShellState"。
所以为了捕获这个事件,必须处理WM_SETTINGCHANGE消息。
//
//最上层框架窗口!
voidCMainFrame:
:
OnSettingChange(UINT
uFlags,LPCTSTRpszSection)
{
if(lpszSection&&
_tcscmp(pszSection,_T("ShellState"))==0){
//dowhatyouwant
}
CFrameWnd:
:
OnSettingChange(uFlags,
pszSection);
}
//
WM_SETTINGCHANGE是个Windows的常用消息,当程序修改了SystemParametersInfo设置,则Windows就会广播此消息。
但WM_SETTINGCHANGE也比较多地用在其它情形。
一般情况下,wParam/uFlags时0,lParam/pszSection是WIN.INI段名或被修改部分的注册表键(只是最终的键,而不是整个串)。
事实上,WM_SETTINGCHANGE常被叫做WM_WININICHANGE,这两个符号在#define中的值也一样!
当IActiveDesktop广播设置修改时,它将“ShellState”作为段名来传递,因为活动桌面设置被存储在一个注册表键中:
\HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellState
另外,如果你要广播自己修改的全程设置,也可以使用WM_SETTINGCHANGE。
广播是应该使用SendMessageTimeout(HWND_BROADCAST,...)函数。
图六TestAD 为了整合所讲的内容,我编写了一个小程序:
TestAD(如图六)。
当TestAD获得WM_SETTINGCHANGE时,便显示一条消息。
利用我创建的一个类(CActiveDesktop)来获得并设置活动桌面的状态。
为了使用这个类,你只要编写如下代码:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用程序 如何 激活 活动 桌面 ActiveDesktop
![提示](https://static.bdocx.com/images/bang_tan.gif)