RegistryChanger〜プログラム完成までの道筋
当ソフトウェアを作成した動機は画面左下のプログラムの実行からregedit.exeを起動して
いちいちレジストリキーを探すのがめんどくさかった為で、
指定したキーを選択した状態でregedit.exeを開けたらどんなに楽だろうか?と思いプログラムを組みました。
プログラムを作成するにあたって、まずすべきことはregedit.exeの性情を知ることでした。
なるほど、regedit.exeは起動時に前回選択したキーを選択した状態で立ち上がることに気がつきました。
と言うことは、ハードのどこかに前回終了時に選択したキーの情報が格納されている事になります。
それはどこか?
おそらくレジストリの可能性が最も高いでしょう。
どうしてそう考えたか?
なぜならWindowsにはそういうパターンが多いからです。
そこでregedit.exeを起動して「regedit」を検索してみました。
すると何個かヒットしました。
さらに、起動時に選択されていたキーを検索してみました。
すると、案の定regeditキーの内部のlastkeyという場所に起動時に選択されていたキーを発見しました。
おそらく、というよりはこの場所が前回終了時に選択したキーの情報が格納されている場所に違いありません。と言うことは、この場所の値を書き換えた後regedit.exeを起動すればよい事になります。
そこでSHSetValue関数を用いて次のようにして値を書き換えます。
Call SHSetValue(HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Applets\Regedit", _
"LastKey", _
REG_SZ, _
ByVal strData, Len(strData))
strDataはフォームに入力したレジストリキー(これから編集しようとしているキー)です。
すると見事に入力したレジストリキーを選択した状態でregedit.exeが起動しました。(←やっぴ〜!)
これにて無事に終了!やっぴ〜やっぴ〜意外と簡単だったなと思いきゃ問題が発生しました。
次の編集キーを入力してもregedit.exeのキー選択状態は不変でした。
どうやらregedit.exeは一度終了して起動しないとキー選択状態は変わらないようです。
当たり前といえば当たり前でしょうがうっかりしていました。
と言うことはこの問題を解決するにはキーの値を書き換える前にregedit.exeを強制終了させねばなりません。
なぜ前かって?後では一回目の起動時がうまくいきません。
そこで前にしてOn Error Resume Nextで一回目の起動時のエラーをスキップさせるわけです。
そうすることで一回目と二回目以降すべてうまくいきます。
それではregedit.exeを強制終了させるにはどうしたらいいか?
その為にはregedit.exeのウィンドウハンドルをFindWindowEx関数で取得してPostMessage関数で
WM_CLOSEを送ってやればいいのです。
よってregedit.exeを強制終了させるには以下のプログラムコードを実行させてやれば良い事になります。
Dim hwnd As Long
hwnd = 0
Do
hwnd = FindWindowEx(0, hwnd, "RegEdit_RegEdit", vbNullString)
If hwnd = 0 Then Exit Do
Call PostMessage(hwnd, WM_CLOSE, 0, 0)
Loop
えっ?上記の「RegEdit_RegEdit」の部分はどうやって取得したかって?
それはご自分でお考えください(笑)。
試して見た所全てOK!パーフェクト!
ってわけで無事RegistryChangerは完成しました。