ページ 1 / 1
C++でレジストリーを操る。
Posted: 2012年3月21日(水) 05:51
by おならちゃん。
デスクトップに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;
}
ご回答よろしくおねがいします。
Re: C++でレジストリーを操る。
Posted: 2012年3月21日(水) 06:34
by beatle
再起動が必要とかそういう理由ですかね・・・?
Re: C++でレジストリーを操る。
Posted: 2012年3月21日(水) 07:22
by おならちゃん。
ご回答ありがとうございます。
再起動しても、変わりませんでした・・・。
ですが、普通にプロパティーから画像の設定で、サイズを合わせるを押すとすぐに、全画面になるじゃないですか
それは、どのようにすれば、c++で自分の書いたプログラムから実行できるのでしょうか?
Re: C++でレジストリーを操る。
Posted: 2012年3月21日(水) 10:47
by softya(ソフト屋)
まず、本当に必要なレジストリ情報が書き換えられているか壁紙の設定メニューから狙った設定に変わっているか確認してみて下さい。
それでダメな場合と、うまく言った場合で切り分けましょう。
Re: C++でレジストリーを操る。
Posted: 2012年3月21日(水) 11:53
by YuO
レジストリの設定が間違っている気がしますが……。
手元のWindows 7環境では,
\HKEY_CURRENT_USER\Control Panel\Desktop\WallpaperStyle
はキーではなく値で,REG_SZ型になっています。
しかし,コードを見ると,キーを作ろうとしていますし,さらにREG_DWORD型の既定値を書き込もうとしています。
実際のレジストリを見ながら,このあたりを修正してみてはどうでしょうか。
あと,参考までに。
http://code.msdn.microsoft.com/windowsd ... r-eb969505
Re: C++でレジストリーを操る。
Posted: 2012年3月23日(金) 17:32
by おならちゃん。
そふちゃさん> レジストリの中をみると、値が変わっているのですが、デスクトップを右クリックおして設定してもその位置のレジストリが変わっていませんでした。
これは、ハンドル・・・変えようと思っているフォルダが違うのでしょうか?
しかし、ゆおさんからもらったサンプルプログラムと同じとこの値が変化していました。
ゆおさん> サンプルプログラムを削ってこうして実行してみたところ、変な値がレジストリに書き込まれてしまいました。
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;
}
削ってはいけないところを削っているのでしょうか?
ご回答ありがとうございました。
Re: C++でレジストリーを操る。
Posted: 2012年3月23日(金) 18:43
by softya(ソフト屋)
名前は適当にアレンジしないでくださいね。誰のことか一瞬わかりませんでした。
まず大切なことですが、
レジストリを変更する場合は必ずバックアップを取って下さい。
書き換えるレジストリーキーは事前に入念に確認する必要があります。
使う関数の仕様は必ず確認しましょう。
「RegSetValueEx 関数」
http://msdn.microsoft.com/ja-jp/library/cc429936.aspx
それとレジストリに書きこまれた値をコピペしてみて下さい。
Re: C++でレジストリーを操る。
Posted: 2012年3月24日(土) 11:10
by おならちゃん。
そふとやさん>すみません。()の中にもかいてあるのに・・・間違えてしまいました。
今回はコードを変えたらできるようになりました。
省略したものは、パス?がどうも、書き方が違ったみたいです。
この書き方なら、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;
}
Re: C++でレジストリーを操る。
Posted: 2012年3月24日(土) 11:44
by softya(ソフト屋)
レジストリの書き換えは成功したとして、「壁紙の設定メニューから狙った設定に変わっているか確認してみて下さい。」に付いてはどうなのですか?
ほんとうに正しい部分のレジストリを書き換えているか確認されましたか?
Re: C++でレジストリーを操る。
Posted: 2012年3月24日(土) 18:46
by おならちゃん。
すみません。 そういうことだったのですね・・・
僕はてっきりプログラムを実行して、プロパティーから行く壁紙の設定を見てその設定が変わっているかどうかを見るのかと思っていました。でも、ずっと疑問に思っていたのですが。まぁデスクトップが変わらなくてもこっちが変わるのだろうとおもっていましたが。
念を押されたので、疑っていましたが、それだと信じようとしていたことが、あれ?ちがうと思い。
よくよく考えてみたところ。
まず設定をしてから、レジストリをみろ、ということだったんですね・・・
レジストリを見た結果・・・・かわってませんでした。
しかしながら・・・
http://smdn.jp/programming/tips/setdeskwallpaper/
こちらのサイトさんには・・・ここを変えているのですが、特別な処置が必要なのでしょうか?
あらためて、すみませんでした。
Re: C++でレジストリーを操る。
Posted: 2012年3月24日(土) 19:04
by softya(ソフト屋)
どっちが先でも良いのですが、レジストリ変更したら「壁紙の設定メニューが狙った設定」に変わるはずです。逆に「壁紙の設定メニューで変更」したらレジストリが書き換わるはずです。
なので、ずっと間違った所でレジストリを書き換えていませんか?って事が疑問がだったわけです。
これもプログラミングのために必要な考え方というか、ちゃんとした処理をしているか確認する手段ですよね。
プログラムを作る時は確認する方法を常に考えておかないとサンプル通りにやったけど動きませんを繰り返すことにしかなりません。
さて、本当のWallpaperStyleやTileWallpaperは何処にあるんでしょうか?それともちゃんと書き換えられているのでしょうか?
まず、WallpaperStyleやTileWallpaperをレジストリから全部探し出してみてください。そしてそれは壁紙のメニューと連動していますか?
闇雲にやっても物事は解決しませんよ。
[補足]
最大のヒントはYuOさんが既に書いているんですけどね。
Re: C++でレジストリーを操る。
Posted: 2012年3月25日(日) 08:47
by おならちゃん。
そふとやさん>まさしくそのとおりでした。これ以外何もいえません・・・
ゆおさん>大変すみませんでした。僕の理解力不足で、勘違いでまよっていました。
適切なご説明ありがとうございました。サンプルプログラムも使わせてもらっています。
ご回答ありがとうございました。無事、本当のレジストリの操作に成功しました。
しかし、問題が一つあります。
それは、レジストリーの操作をしてから反映されるまでに、プロパティーを開いてokを押さないと反映されないということです。
これは、どのようにすれば解決できるのでしょうか?
レジストリーの変更を更新するのでしょうか?
Re: C++でレジストリーを操る。
Posted: 2012年3月25日(日) 09:15
by beatle
名前のアレンジについて、No.7でのsoftyaさんの指摘はどうなってしまったのでしょうか。
Re: C++でレジストリーを操る。
Posted: 2012年3月25日(日) 09:39
by softya(ソフト屋)
私のことだけでは無いですよ、名前の方は本当にお願いします。読み方を例示していない人の名前を勝手に変えるのは失礼にあたる行為ですよ。
画面が変わらない件につていは、何らかのきっかけがないとレジストリの内容がデスクトップ画面に反映されないです。
既にそのための情報をお持ちのはずですよ。自分のやったことを思い出してみて下さい。
Re: C++でレジストリーを操る。
Posted: 2012年3月25日(日) 11:22
by おならちゃん。
失礼いたしました。
おかげさまで 出来ました。
ありがとうございます。
Re: C++でレジストリーを操る。
Posted: 2012年3月25日(日) 11:37
by softya(ソフト屋)
前のコードもそうなのですが、解決したコードを提示して下さい。この掲示板のルールとなっています。
「char型からWCHAR • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=10352
Re: C++でレジストリーを操る。
Posted: 2012年3月26日(月) 06:42
by おならちゃん。
コード:
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);
Re: C++でレジストリーを操る。
Posted: 2012年3月26日(月) 10:36
by softya(ソフト屋)
最終的に壁紙が反映されたコードがこれですか?
問題点が全部解決したコードの提示をお願いします。