物置き

コントロールパネルの一覧を列挙・項目を実行(表示)する手順についてのメモ

自作ツールでコントロールパネルの項目を列挙し、任意の項目を実行するにあたり方法を調べたので以下にメモ

列挙する

  1. 以下のレジストリキー直下にあるキーを列挙する
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace

  2. 直下にあるキー名がコントロールパネルの項目を表すCLSIDなので、これを使って HKEY_CLASSES_ROOT\CLSID 直下にのサブキーを参照する
    例: HKEY_CLASSES_ROOT\CLSID\{87D66A43-7B11-4A28-9811-C86EE395ACF7}

  3. 各キーにLocalizedString値(種類はREG_EXPAND_SZ型)があるので、これを取得する
    例: @%SystemRoot%\System32\srchadmin.dll,-601#immutable1

  4. 取得した値SHLoadIndirectString関数を用いて変換する
    @で始まる文字列を上記APIを使うと実際の文字列に置き換えることができる

その他の情報

  • アイコンはHKEY_CLASSES_ROOT/CLSID/{xxxx...}/DefaultIcon の(既定)にパスが入っている
    • (アイコンリソースを持つモジュールのパス),(インデックス or 識別子) の形式で格納されている

      • (インデックス or 識別子)が正の値の場合はインデックス、負の値の場合はリソース識別子
    • この情報をもとに、WIN32 APIのExtractIconExでアイコンハンドルを取得できるが、-1の時にうまく取れなかった。

      • APIリファレンスをみると、ExtractIcon系のAPIは、indexに-1を指定したとき、アイコンリソース数を返す仕様になっている。
        じかし、ExtractIconExであれば、indexが-1でもラージアイコンorスモールアイコンを受け取る配列を指定していれば、
        アイコンリソース数を返すのでなく、ハンドルをロードする、と読めるような記載があるが、 手元の環境で動かしてみる感じ、アイコンリソース数と思われる数が返ってくる...
    • これは解決できなかったのでしかたなく、indexが-1の時は別途、LoadLibraryEx -> FindResource -> LoadResource -> LockResource -> CreateIconFromResourceで取得する形にした
      • ただ、この方法で取得したアイコンはサイズか色が違ってそうで、このアイコンを描画するとなんか見た目がガビガビなので、もっとよい方法がある気がしてるがとりあえず放置

コントロールパネルの項目を実行(表示)する

HKEY_CLASSES_ROOT/CLSID/{xxxx...}キー内のSystem.ApplicationName値を取得し、 これを %SystemRoot%\System32\control.exe /name <取得した値> とすると、 そのコントロールパネル項目を表示できる。