【 Windows XP 環境における C言語 と 壁紙 】

1. Active Desktop オブジェクトの使用
2. SystemParametersInfo 関数の使用

インクルードファイル
  • 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 をシャットダウンしなくてはならない

  •  
    CoUninitialize();
    


  • 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 関数は動作しません