C++でレジストリーを操る。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
おならちゃん。

C++でレジストリーを操る。

#1

投稿記事 by おならちゃん。 » 14年前

デスクトップにSystemParametersInfoを使って画像を表示することに成功しました。
しかし、問題がすこしありました。それは一枚絵で表示したかったのですが・・・一枚の画像が並べて表示されてしまいました。。
なので、レジストリーを使えば、何とかなるらしいので、レジストリーを操作することにしたのですが、
書いてみました。しかし、レジストリー内のWallpaperStyleとTileWallpaperを2と0にすれば、デスクトップに一枚絵を拡大して表示できるみたいなので、このようなプログラムを書きましたが、レジストリは変更されるのになぜかデスクトップの変更はなかったです。なぜなんですか?

コード:

#include <stdio.h>
#include <windows.h>

int main(){

 HKEY hKeyW,hKeyT;
 DWORD ResultW,ResultT;
 int DWordW=2,DWordT=0;

 RegCreateKeyEx(HKEY_CURRENT_USER,"Control Panel\\Desktop\\WallpaperStyle",0,"",
  REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKeyW,&ResultW);

 RegCreateKeyEx(HKEY_CURRENT_USER,"Control Panel\\Desktop\\TileWallpaper",0,"",
  REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKeyT,&ResultT);

 RegSetValueEx(hKeyW,"",0,REG_DWORD,(CONST BYTE*)&DWordW,sizeof(DWordW));
 RegSetValueEx(hKeyT,"",0,REG_DWORD,(CONST BYTE*)&DWordT,sizeof(DWordT));

 RegCloseKey(hKeyW);
 RegCloseKey(hKeyT);

 return 0;
}
ご回答よろしくおねがいします。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: C++でレジストリーを操る。

#2

投稿記事 by beatle » 14年前

再起動が必要とかそういう理由ですかね・・・?

おならちゃん。

Re: C++でレジストリーを操る。

#3

投稿記事 by おならちゃん。 » 14年前

ご回答ありがとうございます。
再起動しても、変わりませんでした・・・。
ですが、普通にプロパティーから画像の設定で、サイズを合わせるを押すとすぐに、全画面になるじゃないですか

それは、どのようにすれば、c++で自分の書いたプログラムから実行できるのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++でレジストリーを操る。

#4

投稿記事 by softya(ソフト屋) » 14年前

まず、本当に必要なレジストリ情報が書き換えられているか壁紙の設定メニューから狙った設定に変わっているか確認してみて下さい。
それでダメな場合と、うまく言った場合で切り分けましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: C++でレジストリーを操る。

#5

投稿記事 by YuO » 14年前

レジストリの設定が間違っている気がしますが……。

手元のWindows 7環境では,
\HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperStyle
はキーではなく値で,REG_SZ型になっています。
しかし,コードを見ると,キーを作ろうとしていますし,さらにREG_DWORD型の既定値を書き込もうとしています。
実際のレジストリを見ながら,このあたりを修正してみてはどうでしょうか。

あと,参考までに。http://code.msdn.microsoft.com/windowsd ... r-eb969505

おならちゃん。

Re: C++でレジストリーを操る。

#6

投稿記事 by おならちゃん。 » 14年前

そふちゃさん> レジストリの中をみると、値が変わっているのですが、デスクトップを右クリックおして設定してもその位置のレジストリが変わっていませんでした。
これは、ハンドル・・・変えようと思っているフォルダが違うのでしょうか?
しかし、ゆおさんからもらったサンプルプログラムと同じとこの値が変化していました。

ゆおさん> サンプルプログラムを削ってこうして実行してみたところ、変な値がレジストリに書き込まれてしまいました。
2を書き込みたいのにdから始まり何桁かの数字がはいっていました。

コード:

#include <windows.h> 
#include <stdio.h>
int main(){
HKEY hKey = NULL;
    RegOpenKeyEx(HKEY_CURRENT_USER, 
       L"Control Panel\\Desktop", 0, KEY_READ | KEY_WRITE, &hKey);
		
        PWSTR pszWallpaperStyle = L"2";
        PWSTR pszTileWallpaper = L"0";
      
        DWORD cbData = lstrlen(pszWallpaperStyle) * sizeof(*pszWallpaperStyle);
        RegSetValueEx(hKey, L"WallpaperStyle", 0, REG_SZ,
            reinterpret_cast<const BYTE *>(pszWallpaperStyle), cbData);
    
              cbData = lstrlen(pszTileWallpaper) * sizeof(*pszTileWallpaper);
        RegSetValueEx(hKey, L"TileWallpaper", 0, REG_SZ,
            reinterpret_cast<const BYTE *>(pszTileWallpaper), cbData); 
       RegCloseKey(hKey);
    
 return 0;
 }
削ってはいけないところを削っているのでしょうか?
ご回答ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++でレジストリーを操る。

#7

投稿記事 by softya(ソフト屋) » 14年前

名前は適当にアレンジしないでくださいね。誰のことか一瞬わかりませんでした。

まず大切なことですが、
レジストリを変更する場合は必ずバックアップを取って下さい。
書き換えるレジストリーキーは事前に入念に確認する必要があります。
使う関数の仕様は必ず確認しましょう。

「RegSetValueEx 関数」
http://msdn.microsoft.com/ja-jp/library/cc429936.aspx

それとレジストリに書きこまれた値をコピペしてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

おならちゃん。

Re: C++でレジストリーを操る。

#8

投稿記事 by おならちゃん。 » 14年前

そふとやさん>すみません。()の中にもかいてあるのに・・・間違えてしまいました。

今回はコードを変えたらできるようになりました。
省略したものは、パス?がどうも、書き方が違ったみたいです。
この書き方なら、WallpaperStyleとTileWallpaperに2と0を入れることが出来ました。
しかし、デスクトップの画像は変わりませんでした。
再起動しても変わりませんでした。

コード:

#include <windows.h> 
#include <stdio.h>
int main(){
HKEY hKey = NULL,hKey2 = NULL;
    RegOpenKeyEx(HKEY_CURRENT_USER, 
       L"Control Panel\\Desktop\\WallpaperStyle", 0, KEY_READ | KEY_WRITE, &hKey);
     RegOpenKeyEx(HKEY_CURRENT_USER, 
       L"Control Panel\\Desktop\\TileWallpaper", 0, KEY_READ | KEY_WRITE, &hKey2);
        
        PWSTR pszWallpaperStyle = L"2";
        PWSTR pszTileWallpaper = L"0";
      
        DWORD cbData = lstrlen(pszWallpaperStyle) * sizeof(*pszWallpaperStyle);
        RegSetValueEx(hKey, L"", 0, REG_SZ,
            reinterpret_cast<const BYTE *>(pszWallpaperStyle), cbData);
    
              cbData = lstrlen(pszTileWallpaper) * sizeof(*pszTileWallpaper);
        RegSetValueEx(hKey2, L"", 0, REG_SZ,
            reinterpret_cast<const BYTE *>(pszTileWallpaper), cbData); 
       RegCloseKey(hKey);
	   RegCloseKey(hKey2);
    
 return 0;
 } 

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++でレジストリーを操る。

#9

投稿記事 by softya(ソフト屋) » 14年前

レジストリの書き換えは成功したとして、「壁紙の設定メニューから狙った設定に変わっているか確認してみて下さい。」に付いてはどうなのですか?
ほんとうに正しい部分のレジストリを書き換えているか確認されましたか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

おならちゃん。

Re: C++でレジストリーを操る。

#10

投稿記事 by おならちゃん。 » 14年前

すみません。 そういうことだったのですね・・・
僕はてっきりプログラムを実行して、プロパティーから行く壁紙の設定を見てその設定が変わっているかどうかを見るのかと思っていました。でも、ずっと疑問に思っていたのですが。まぁデスクトップが変わらなくてもこっちが変わるのだろうとおもっていましたが。
念を押されたので、疑っていましたが、それだと信じようとしていたことが、あれ?ちがうと思い。
よくよく考えてみたところ。
まず設定をしてから、レジストリをみろ、ということだったんですね・・・
レジストリを見た結果・・・・かわってませんでした。
しかしながら・・・http://smdn.jp/programming/tips/setdeskwallpaper/
こちらのサイトさんには・・・ここを変えているのですが、特別な処置が必要なのでしょうか?

あらためて、すみませんでした。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++でレジストリーを操る。

#11

投稿記事 by softya(ソフト屋) » 14年前

どっちが先でも良いのですが、レジストリ変更したら「壁紙の設定メニューが狙った設定」に変わるはずです。逆に「壁紙の設定メニューで変更」したらレジストリが書き換わるはずです。
なので、ずっと間違った所でレジストリを書き換えていませんか?って事が疑問がだったわけです。

これもプログラミングのために必要な考え方というか、ちゃんとした処理をしているか確認する手段ですよね。
プログラムを作る時は確認する方法を常に考えておかないとサンプル通りにやったけど動きませんを繰り返すことにしかなりません。
さて、本当のWallpaperStyleやTileWallpaperは何処にあるんでしょうか?それともちゃんと書き換えられているのでしょうか?
まず、WallpaperStyleやTileWallpaperをレジストリから全部探し出してみてください。そしてそれは壁紙のメニューと連動していますか?
闇雲にやっても物事は解決しませんよ。

[補足]
最大のヒントはYuOさんが既に書いているんですけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

おならちゃん。

Re: C++でレジストリーを操る。

#12

投稿記事 by おならちゃん。 » 14年前

そふとやさん>まさしくそのとおりでした。これ以外何もいえません・・・

ゆおさん>大変すみませんでした。僕の理解力不足で、勘違いでまよっていました。
適切なご説明ありがとうございました。サンプルプログラムも使わせてもらっています。


ご回答ありがとうございました。無事、本当のレジストリの操作に成功しました。
しかし、問題が一つあります。
それは、レジストリーの操作をしてから反映されるまでに、プロパティーを開いてokを押さないと反映されないということです。
これは、どのようにすれば解決できるのでしょうか?
レジストリーの変更を更新するのでしょうか?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: C++でレジストリーを操る。

#13

投稿記事 by beatle » 14年前

名前のアレンジについて、No.7でのsoftyaさんの指摘はどうなってしまったのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++でレジストリーを操る。

#14

投稿記事 by softya(ソフト屋) » 14年前

私のことだけでは無いですよ、名前の方は本当にお願いします。読み方を例示していない人の名前を勝手に変えるのは失礼にあたる行為ですよ。

画面が変わらない件につていは、何らかのきっかけがないとレジストリの内容がデスクトップ画面に反映されないです。
既にそのための情報をお持ちのはずですよ。自分のやったことを思い出してみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

おならちゃん。

Re: C++でレジストリーを操る。

#15

投稿記事 by おならちゃん。 » 14年前

失礼いたしました。
おかげさまで 出来ました。
ありがとうございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++でレジストリーを操る。

#16

投稿記事 by softya(ソフト屋) » 14年前

前のコードもそうなのですが、解決したコードを提示して下さい。この掲示板のルールとなっています。

「char型からWCHAR • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=10352
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

おならちゃん。

Re: C++でレジストリーを操る。

#17

投稿記事 by おならちゃん。 » 14年前

コード:

	LPCSTR pszWallpaperStyle,pszTileWallpaper;

	printf("画面表示設定\n中央に表示=0\n並べて表示=1\n拡大して表示=2\n\n数値入力=:");
	scanf("%d",&desk);

	if(desk==0){
		 pszWallpaperStyle = "0";
         pszTileWallpaper = "0";
	}else if(desk==1){
		 pszWallpaperStyle = "0";
         pszTileWallpaper = "1";
	}else if(desk==2){
		 pszWallpaperStyle = "2";
         pszTileWallpaper = "0";
	};

	HKEY hKey = NULL;
    RegOpenKeyEx(HKEY_CURRENT_USER, 
       "Control Panel\\Desktop", 0, KEY_READ | KEY_WRITE, &hKey);
      
        DWORD cbData = lstrlen(pszWallpaperStyle) * sizeof(*pszWallpaperStyle);
        RegSetValueEx(hKey, "WallpaperStyle", 0, REG_SZ,
            reinterpret_cast<const BYTE *>(pszWallpaperStyle), cbData);
    
              cbData = lstrlen(pszTileWallpaper) * sizeof(*pszTileWallpaper);
        RegSetValueEx(hKey, "TileWallpaper", 0, REG_SZ,
            reinterpret_cast<const BYTE *>(pszTileWallpaper), cbData); 
       RegCloseKey(hKey);

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++でレジストリーを操る。

#18

投稿記事 by softya(ソフト屋) » 14年前

最終的に壁紙が反映されたコードがこれですか?
問題点が全部解決したコードの提示をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る