【 Windows XP 環境における C言語 と 壁紙 】
インクルードファイル |
Active Desktop オブジェクトを使用するには、以下のインクルードファイル を以下の順番で記述する必要があります
#include <wininet.h>
#include <shlobj.h>
|
作成と解放 |
HRESULT hr;
IActiveDesktop *pActiveDesktop;
// 作成
hr = CoCreateInstance(
CLSID_ActiveDesktop,
NULL,
CLSCTX_INPROC_SERVER,
IID_IActiveDesktop,
(void**)&pActiveDesktop
);
// 解放
pActiveDesktop->Release();
|
COM 使用の前提条件 |
アプリケーションの始めで NULL を指定して CoInitialize 関数を呼び出し、COM を初期化する必要がある
if ( FAILED( CoInitialize( NULL ) ) ) {
return FALSE;
}
アプリケーションを閉じる前に CoUninitialize 関数 を使って COM をシャットダウンしなくてはならない
|
SetWallpaper メソッドで壁紙の変更を行います
#include <wininet.h>
#include <shlobj.h>
#include <comdef.h>
void MyDesktopWallpaper( void )
{
if ( FAILED( CoInitialize( NULL ) ) ) {
return;
}
HRESULT hr;
IActiveDesktop *pActiveDesktop;
DWORD dwReserved = 0;
char *EntryPath = "D:\\TEMP\\壁紙.jpg";
_bstr_t WallPath( EntryPath );
// 作成
hr = CoCreateInstance(
CLSID_ActiveDesktop,
NULL,
CLSCTX_INPROC_SERVER,
IID_IActiveDesktop,
(void**)&pActiveDesktop
);
if ( !FAILED( hr ) ) {
hr = pActiveDesktop->SetWallpaper( WallPath, dwReserved );
if ( !FAILED( hr ) ) {
pActiveDesktop->ApplyChanges( AD_APPLY_ALL );
}
// 解放
pActiveDesktop->Release();
}
CoUninitialize();
}
解説 |
ApplyChangesメソッドを実行しないと、変更されません。レジストリに 情報が書き込まれる事もありません ApplyChangesメソッドを実行するとレジストリは以下のようになります
|
HKCU\Control Panel\Desktop
Wallpaper=C:\Documents and Settings\lightbox\Local Settings\Application Data\Microsoft\Wallpaper1.bmp
HKCU\Control Panel\Desktop
ConvertedWallpaper=D:\TEMP\壁紙.jpg
HKCU\Software\Microsoft\Internet Explorer\Desktop\General
Wallpaper=%USERPROFILE%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp
HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\LastTheme
Wallpaper=
解説 |
Wallpaper1.bmp は、壁紙.jpg が変換されたものです ConvertedWallpaper エントリはそれを意味するもので、壁紙を消去しても エントリがなくなる事はありません 壁紙の消去は、char *EntryPath = ""; で実行されます このレジストリの状態は、画面のプロパティから設定した状態と多少違います その状態は以下のようなものです
|
HKCU\Control Panel\Desktop
Wallpaper=C:\Documents and Settings\lightbox\Local Settings\Application Data\Microsoft\Wallpaper1.bmp
HKCU\Control Panel\Desktop
ConvertedWallpaper=D:\TEMP\壁紙.jpg
HKCU\Software\Microsoft\Internet Explorer\Desktop\General
Wallpaper=D:\TEMP\壁紙.jpg
HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\LastTheme
Wallpaper=D:\TEMP\壁紙.jpg
解説 |
即時変更でなくてもよければ、レジストリエントリの値をクリアして ログオフすれば、再ログオン時に壁紙は消去されます
|
一時変更 |
SystemParametersInfo 関数による壁紙変更は、レジストリを変更しない のでその壁紙を永続して使用したい場合は、レジストリ変更もあわせて行 なう必要があります 但し設定できるファイルは BMP ファイルのみなので注意
LPTSTR lpFile = "D:\\TEMP\\壁紙.BMP";
SystemParametersInfo(
SPI_SETDESKWALLPAPER,
0,
lpFile,
SPIF_SENDCHANGE
);
|
壁紙を消去したいのであれば、元の指定が JPG でも問題は無いようです
但し、元の指定が Web ページの場合は消去されません
その際のレジストリは以下のようになっています
HKCU\Control Panel\Desktop
Wallpaper=
HKCU\Control Panel\Desktop
ConvertedWallpaper=
HKCU\Software\Microsoft\Internet Explorer\Desktop\General
Wallpaper=D:\TEMP\壁紙2.htm
HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\LastTheme
Wallpaper=D:\TEMP\壁紙2.htm
つまり、Web ページが指定されている時、SystemParametersInfo 関数は動作しません
|