やねうらおさんへ: bmdです。 スーパープログラマへの道の 第BF回 を読んでいろいろ書こうと 思っていたのですが 第C1回 で解決したようなので (^^; 単に参考として見てやってください (^^; 現在の壁紙を変更するには: SystemParametersInfo( SPI_SETDESKWALLPAPER, NULL, lpszFileName, SPIF_UPDATEINIFILE ); でOKです。Windows95/98の場合、関数終了後に ファイル(lpszFileName) は もう不要で削除しても構いません。NT4/2000は画面モードを切替えると 壁紙ファイルを読み直すようで、ファイルを消すと画面モードを 切替えたときに壁紙もきえてしまいます。 しかし、これだとActiveDesktopが壁紙の変更を認識しないため、 SystemParametersInfo( SPI_SETDESKWALLPAPER, NULL, lpszFileName, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE ); としてActiveDesktopなどに通知しなければなりません。 HKEY_CURRENT_USER の Control Panel\Desktop に 壁紙に関する設定がいくつかあります。これらの値を指定した後に SystemParametersInfo() で壁紙を変更すると値が反映されます。 ・TileWallpaper(REG_SZ) は指定した壁紙を並べて表示するかのフラグです。 値は "0" か "1" ・WallpaperStyle(REG_SZ) は指定した壁紙を画面全体に引き延ばして 表示するかどうかのフラグです。値は "0" か "2" ・WallPaperOriginX(REG_SZ) は指定した壁紙を表示するX座標です。 WallPaperOriginY(REG_SZ) は指定した壁紙を表示するY座標です。 この2つと TileWallpaper の併用は不可だったはずです。 ほかに Wallpaper(REG_SZ) というエントリがあって、ここに 壁紙のファイル名が記憶されていますが、ここを直接書換えて 他のトップレベルウィンドウに通知しなかった場合、 次の壁紙変更のタイミング(95/98は次のログイン、NT4/2000だと それに加えて画面モードの切替え時)まで壁紙は変更されません。 スタートアップで起動して次の起動時の壁紙を変更するような アプリケーションで有効です。 現在の壁紙を変えるだけなら SystemParametersInfo( SPI_SETDESKWALLPAPER, NULL, lpszFileName, 0 ); でOKです。ActiveDesktopを使用中なら HKEY hkey; char tmp[FNAME_MAX]; DWORD nTmp=FNAME_MAX; RegOpenKey( HKEY_CURRENT_USER, "Control Panel\\desktop\\", &hkey ); RegQueryValueEx( hkey, "Wallpaper", NULL, NULL, (LPBYTE)tmp, &nTmp ); SystemParametersInfo( SPI_SETDESKWALLPAPER, NULL, lpszFileName, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE ); RegSetValueEx( hkey, "Wallpaper", 0, REG_SZ, (const LPBYTE)tmp, lstrlen(tmp)+1 ); RegCloseKey( hkey ); なんか見苦しい (笑 ※ 捕捉: ActiveDesktopを使用中かどうかを調べる _IsActiveDesktopUsing() でActiveDesktopのウィンドウを検索します。 他にいい方法知ってたら教えてください (笑 なお、ここでの "デスクトップ領域" ってのは、画面全体から タスクバーとかの領域を除いたものです。 // 指定したクラス名をもつ子ウィンドウを検索 HWND _FindChildWindowFromClassname( HWND hWndParent, LPSTR lpszClassName ) { char classname[400]; HWND hWnd = GetTopWindow( hWndParent ); if( !hWnd ) return( NULL ); while( hWnd ) { GetClassName( hWnd, classname, 400 ); if( !lstrcmpi( classname, lpszClassName ) ) return( hWnd ); hWnd = GetWindow( hWnd, GW_HWNDNEXT ); } return( NULL ); } // デスクトップ領域のウィンドウを検索 HWND _GetDesktopWindow( VOID ) { HWND hWnd = FindWindow( "Progman", "Program Manager" ); if( !hWnd ) return( GetDesktopWindow() ); hWnd = _FindChildWindowFromClassname( hWnd, "SHELLDLL_DefView" ); if( !hWnd ) return( GetDesktopWindow() ); return( hWnd ); } // デスクトップ領域を得る VOID _GetDesktopRect( LPRECT desktoprect ) { HWND desktophandle=_GetDesktopWindow(); GetWindowRect( desktophandle, desktoprect ); } // ActiveDesktop使用中? BOOL _IsActiveDesktopUsing( VOID ) { HWND hWnd = _GetDesktopWindow(); if( !hWnd ) return( FALSE ); hWnd = _FindChildWindowFromClassname( hWnd, "Internet Explorer_Server" ); return( (BOOL)hWnd ); } ちなみにうちもWindows関連の本を持ってません (^^; 参考にしてたのは Visual C++ 2 のAPIヘルプですね。 それではぁ bmd http://www.miryu2001.com/bmd/ ( mailto:bmd@miryu2001.com )