自作ツールでコントロールパネルの項目を列挙し、任意の項目を実行するにあたり方法を調べたので以下にメモ
列挙する
以下のレジストリキー直下にあるキーを列挙する
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace
直下にあるキー名がコントロールパネルの項目を表すCLSIDなので、これを使って HKEY_CLASSES_ROOT\CLSID 直下にのサブキーを参照する
例:HKEY_CLASSES_ROOT\CLSID\{87D66A43-7B11-4A28-9811-C86EE395ACF7}
各キーにLocalizedString値(種類はREG_EXPAND_SZ型)があるので、これを取得する
例:@%SystemRoot%\System32\srchadmin.dll,-601#immutable1
取得した値SHLoadIndirectString関数を用いて変換する
@
で始まる文字列を上記APIを使うと実際の文字列に置き換えることができる
その他の情報
- アイコンはHKEY_CLASSES_ROOT/CLSID/{xxxx...}/DefaultIcon の(既定)にパスが入っている
(アイコンリソースを持つモジュールのパス),(インデックス or 識別子)
の形式で格納されている(インデックス or 識別子)
が正の値の場合はインデックス、負の値の場合はリソース識別子
この情報をもとに、WIN32 APIのExtractIconExでアイコンハンドルを取得できるが、-1の時にうまく取れなかった。
- これは解決できなかったのでしかたなく、indexが-1の時は別途、
LoadLibraryEx
->FindResource
->LoadResource
->LockResource
->CreateIconFromResource
で取得する形にした- ただ、この方法で取得したアイコンはサイズか色が違ってそうで、このアイコンを描画するとなんか見た目がガビガビなので、もっとよい方法がある気がしてるがとりあえず放置
コントロールパネルの項目を実行(表示)する
HKEY_CLASSES_ROOT/CLSID/{xxxx...}
キー内のSystem.ApplicationName
値を取得し、
これを %SystemRoot%\System32\control.exe /name <取得した値>
とすると、
そのコントロールパネル項目を表示できる。