1. 程式人生 > >win32 使用COM和API設定動態桌布

win32 使用COM和API設定動態桌布

大家都知道設定WINDOWS桌面牆紙的WIN32API是SystemParametersInfo,使用SPI_SETDESKWALLPAPER引數便能設定牆紙:
::SystemParametersInfo(SPI_SETDESKWALLPAPER,0,"C:\\ABitmap.bmp",SPIF_SENDWININICHANGE|SPIF_UPDATEINIFILE);
但問題並沒有解決,因為這個WIN32API有很大的侷限性
1.無法把jpeg,gif等其他非點陣圖格式的圖片設為牆紙。
2.無法調整牆紙的式樣,即無法設定牆紙為居中,平鋪或拉伸。(當然我們可以通過程式設計改變登錄檔HKEY_CURRENT_USER\ControlPanel\Desktop的值來做到這一點)
由於在顯示屬性系統對話方塊內很容易手動設定這些選項,我們有理由相信,WindowsShellAPI一定提供了相應的比較高層的函式,介面或類來完成牆紙的設定。事實上,WindowsShellAPI中確實存在完成這個任務的介面:IActiveDesktop。
以下是我所完成的設定牆紙的函式
//strPicFile是影象檔名,支援BMPJPEGGIF等格式
//dwStyle是牆紙的樣式
//WPSTYLE_CENTER居中0
//WPSTYLE_TILE平鋪1
//WPSTYLE_STRETCH拉伸2
//WPSTYLE_MAX3
//返回值是TRUE時牆紙設定成功,返回FALSE時失敗
BOOLSetWallpaper(CString&strPicFile,DWORDdwStyle)
{
HRESULThr;
IActiveDesktop*pIAD;

CoInitialize(NULL);
//建立介面的例項
hr=CoCreateInstance(CLSID_ActiveDesktop,NULL,CLSCTX_INPROC_SERVER,
IID_IActiveDesktop,(void**)&pIAD);
if(!SUCCEEDED(hr))returnFALSE;
//將檔名改為寬字串,這是IActiveDesktop::SetWallpaper的要求
WCHARwszWallpaper[MAX_PATH];
LPTSTRlpStr=strPicFile.GetBuffer(strPicFile.GetLength());
MultiByteToWideChar(CP_ACP,0,lpStr,-1,wszWallpaper,MAX_PATH);
strPicFile.ReleaseBuffer();
//設定牆紙
hr=pIAD->SetWallpaper(wszWallpaper,0);
if(!SUCCEEDED(hr))returnFALSE;
//設定牆紙的樣式
WALLPAPEROPTwpo;
wpo.dwSize=sizeof(wpo);
wpo.dwStyle=dwStyle;
hr=pIAD->SetWallpaperOptions(&wpo,0);
if(!SUCCEEDED(hr))returnFALSE;
//應用牆紙的設定
hr=pIAD->ApplyChanges(AD_APPLY_ALL);
if(!SUCCEEDED(hr))returnFALSE;
//讀取牆紙的檔名並列印在debug視窗內
hr=pIAD->GetWallpaper(wszWallpaper,MAX_PATH,0);
CStringstrFile=wszWallpaper;
TRACE(strFile);//如果不用點陣圖的話,這裡有你意想不到的發現
//釋放介面的例項
pIAD->Release();
     CoUninitialize();
returnTRUE;
}
在MFC程式中應用此函式時,須注意以下三點。
1.在函式所在檔案中加上宣告IActiveDesktop的標頭檔案
#include<shlobj.h>
2.在StdAfx.h中插入#include<wininet.h>
位置不能搞錯,否則IActiveDesktop將找不到定義
#include<afxwin.h>//MFCcoreandstandardcomponents
#include<wininet.h>//NOTE:correctscompilationerrorsw/IActiveDesktop!!
#include<afxext.h>//MFCextensions
3.由於此函式引用了COM元件,所以必須在C**App::OnInitInstance()中插入以下語句,初始化COM元件。
AfxOleInit();
補充:
只有在安裝了IE4.0及以上版本時才能應用IActiveDesktop介面,只有在開啟activedesktop(活動桌面)的情況下才能應用SetWallpaper函式,下面是啟用或關閉activedesktop的函式:
//bEnable是TRUE時啟用activedesktop,是FALSE時關閉
//返回值是TRUE時啟用或關閉activedesktop成功,返回FALSE時失敗
BOOLEnableActiveDesktop(BOOLbEnable)
{
HRESULThr;
IActiveDesktop*pIAD;
     CoInitialize ( NULL ); 

//建立介面的例項
hr=CoCreateInstance(CLSID_ActiveDesktop,NULL,CLSCTX_INPROC_SERVER,
IID_IActiveDesktop,(void**)&pIAD);
if(!SUCCEEDED(hr))returnFALSE;
COMPONENTSOPTcomp;
comp.dwSize=sizeof(comp);
comp.fEnableComponents=bEnable;
//啟用或關閉activedesktop
comp.fActiveDesktop=bEnable;
hr=pIAD->SetDesktopItemOptions(&comp,0);
if(!SUCCEEDED(hr))returnFALSE;
//釋放介面的例項
pIAD->Release;
     CoUninitialize();

returnTRUE;
}

相關推薦

win32 使用COMAPI設定動態桌布

大家都知道設定WINDOWS桌面牆紙的WIN32API是SystemParametersInfo,使用SPI_SETDESKWALLPAPER引數便能設定牆紙:::SystemParametersInfo(SPI_SETDESKWALLPAPER,0,"C:\\ABitmap.bmp",SPIF_SENDW

如何設定電腦桌面動態桌布

今天看到有朋友電腦桌面是動態模式,甚是喜歡,可以看出一個人的性格與品位。那麼如何將電腦桌布換成動態的呢? 1.下載一款軟體安裝。   2.安裝好後,可以根據自己需求選擇,並下載,下載完後在本地桌布應用即可。雙擊桌面即可清空桌面。乾淨的呈現。 3.我們想把自己的視訊、網頁、桌布

Windows如何設定動態靜態ip地址

開啟控制面板,一般在電腦的選單欄能找到,win8和win10可以使用快捷鍵(win鍵+X鍵),找不到的朋友可以搜尋一下。   進入到網路和共享中心,點選更改介面卡設定。

在自己應用中判斷剛剛去往動態桌布預覽頁面的桌布是否設定成功

本來從動態桌布預覽頁面設定一個動態桌布回到桌面便可以看到桌面動態桌布,可以觀察得到自己的動態桌布是否設定成功了(必須知道設定是否成功的結構,因為還有一些操作需要完成)! 但是現在是要在自己的應用中進入到動態桌布預覽頁面(去往某個動態桌布的預覽頁面,那裡可以設定桌布)點選“設

linux設定動態庫路徑環境變數

linux安裝原始碼編譯出來的庫後,如何讓系統預設識別到, 如編譯後安裝在/usr/local/aarch64-qt下 1、設定動態庫連結配置 如果不設定動態庫連線,系統就找不到需要的*.so,導致軟體執行失敗。 可以ldd一下,如: [email protected]:~$ ldd

織夢dedecms手機訪問以 m.xxx.com www.xxx.com設定方法

相對於所有使用者的訪問方式來說,同步站的訪問方式分為兩種,一種是以www.xxx.com/m 的二級目錄訪問方式,二是以 m.xxx.com 的方式,現在我以本外掛安裝好後,兩種不同的訪問方式做下解釋,   1. 當我們以www.xxx.com/m 這種訪問方式來的時候

scrapy中自定義下載中介軟體設定動態User-Agent代理ip

''' scrapy 自定義下載中介軟體 動態設定User-Agent ''' import random class RandomUserAgent: def __init__(self, agents): self.agents = agent

iframe設定錨點來解決重新整理時跳轉到其他頁面點選動態生成的選單欄讓其高亮的思路

我們在使用iframe時,一般是很多子頁面共用一個選單欄,然後點選不同選單切換到不同的子頁面,但是當你重新整理時可能會碰到跳轉到其他頁面的情況,這個時候就需要設定錨點來解決。 另外,我們還需要解決點選選單欄讓它處於高亮的選中狀態。並且在設定錨之後,還要處理如何

動態設定video的寬高的方法,js設定CSS設定

一、csss設定 html: <div class="wrap"> <video controls="controls" class="videoBox" #iframe

無法訪問google相關網站,/developer.android.commail.google.com國內訪問設定

自從被牆了之後,想開啟一下官方網站都不行了。。。一直喜歡檢視使用官方的最新的文件。去第三方的習慣,不適應。想辦法了。。 兩種都是很簡單的方法。 一種自己去使用vpn。 vps也有很多的免費和收費的。好處就是,可以去上更多的國外網站。更加的自由。 一種就是改hosts。

[WIN32]SystemParametersInfo 可用於設定桌布

【uiAction】 該引數指定要查詢或設定的系統級引數。其取值如下; Accessibility parameters Desktop parameters Icon parameters Input parameters Menu parameters Power parameters Screen s

思科E3200 路由器 DD-WRT 設定花生殼3322.org動態域名(DDNS)

花生殼設定(已測試) ddns.oray.com:80 使用者名稱   aaaa 密碼 bbbb 主機名   abc.gicp.net URL       /ph/update?hostname=abc 3322.org設定(已測試) 使用者名稱   aaaa 密碼 bbb

C#設定預設印表機-COMWMI二種方式

COM方式:使用Winspool.drv WMI方式:Class=Win32_ Printer  另注(Powershell中可以 gwmi -Class "Win32_Printer"找到List ) C#實現 using System; using System.C

即將到來的Autodesk 主要產品2015版 產品API新功能在線培訓(免費)

ont ref oca auto 即將 content span bsp 報名 一年一度的Autodesk主要產品和API在線培訓課程在5月份即將開始。我們呈獻給大家5個課程。1. Revit 2015 產品新功能及API 概覽2. Vault 2015產品新功能及API

.com.cn域名的區別所在,各個域名後綴含義

簡介 裏的 .cn dad 代碼 類別 用途 開始 含義 很多人在註冊域名的時候不明白域名後綴的含義,在這裏就介紹兩種最為常用的域名,介紹下他們的區別以及適用的範圍。需要先查詢是否被註冊,我們經常去的就是西部數據和萬網,查詢並註冊未被註冊的域名,一般無論是什麽域名

Python類實例方法屬性的動態綁定

tuple attribute 名稱 one 運行 作用 span people tee python中實例創建後可以給實例綁定任何屬性和方法 class Student(object): pass   給實例綁定一個屬性: s=Student() s.n

aNDROID動態桌布例程交流

music lis and android hao123 androi app http 5% %E7%AC%AC%E4%B8%89%E6%96%B9app%E7%94%A8%E5%BE%AE%E4%BF%A1%E8%B4%A6%E5%8F%B7%E7%99%BB%E5%B

日期API

檢查 static 分片 add cep mat first now() calendar類   Java1.0對日期和時間的支持只能依賴java.util.Date類,年份的起始選擇是1900你那,月份的起始是從0開始計算的。它的返回值中包含了JVM的默認市區CET,即中

使用custombox validate 對動態加載的表達無法驗證的解決辦法

hive eset move 找不到 scrip 內容 uno tor reset custombox.min.js v3.0.2 jquery.validate.min.js jQuery Validation Plugin - v1.14.0 客戶端用MVC的分部

06.庫API設計

src es2017 http 1-1 分享 .cn cnblogs img images 06.庫和API設計