2011年8月28日日曜日

コンピューターアイコンに便利な機能を付ける 5

ExtendedSubCommandsKey カスケード メニュー

ExtendedSubCommandsKeyの使い方

前回のSubcommandsHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore からの参照だけなのに対して、ExtendedSubCommandsKey は参照先を指定できます。

参照先がHKEY_CLASSES_ROOTに変わっただけでほとんど Subcommands と同じで併用もできますShell コマンドだけというのも同様。

…だと思います。

かなり自信がありません。参考程度にお願いします。(文末に言い訳あり)

2014 年、おおよそ理解できたのでデスクトップのシェルメニューをサブメニューにするExtendedSubCommandsKey を使ったカスタマイズを追記しました。

例に挙げたものについては動作を確認しましたが、例1の他のキーは呼び出せない場合があります。例2については注意点がありますが大丈夫だと思います。

フォルダーの背景に ExtendedSubCommandsKey でメニューを追加してみます。

例1 既存のメニューを呼び出す

  1. フォルダーの背景にmyShell (適当な名前)キーを作成します。

    HKEY_CLASSES_ROOT\directory\BackGround\shell\myShell

    フォルダーの背景

  2. ExtendedSubCommandsKey(文字列値)を作成して、DesktopBackgroundにします。

    ExtendedSubCommandsKey

Window 7 のデスクトップのメニューを呼び出しています。

HKEY_CLASSES_ROOT\DesktopBackground\Shell

デスクトップのメニュー

例2 独自にメニューを設定しておく

  1. HKEY_CLASSES_ROOT\MyTools (適当な名前)キーを作成して、Shellコマンドを設定しておきます。
    フォルダー オプション を設定してみました。control folders
    control folders

  2. この時、項目のキーの(既定)か MUIVerb 値で名前を設定しておかないと表示されません。
    項目名が必要
    MUIVerb

  3. HKEY_CLASSES_ROOT\directory\BackGround\shell\myShell

    ExtendedSubCommandsKey (文字列値)を作成して、MyToolsにします。

    ExtendedSubCommandsKey

    フォルダー オプション

Subcommands のように ; (セミコロン)でメニューを並べることはできません。


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\MyTools\shell\FolderOption]
"Icon"="%SystemRoot%\\system32\\imageres.dll,-166"
"MUIVerb"="@%SystemRoot%\\system32\\shell32.dll,-22985"

[HKEY_CLASSES_ROOT\MyTools\shell\FolderOption\command]
@="control folders"

[HKEY_CLASSES_ROOT\directory\BackGround\shell\myShell]
"ExtendedSubCommandsKey"="MyTools"

2011年8月22日月曜日

コンピューターアイコンに便利な機能を付ける 4

Subcommands カスケード メニュー

Subcommands のもう一つの使い方です。

前回の Subcommands に、値のデータを追加すると予め定義されたコマンドを呼び出すことができます。

Windows7 のエクスプローラーのツールバーのボタンで実際に使われています。

Toolbar Button

呼び出せるコマンド群は以下のキーで定義されています。

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell


2011年8月15日月曜日

コンピューターアイコンに便利な機能を付ける 3 🗫 Subcommands でメニューを階層構造に!

Subcommands を使うとメニューを階層構造にできます。

全て説明するとあまりにも長くなってしまうので、ポイントだけ取り上げてみます。

基本的な、ContextMenu の追加の方法は、少しですが 当ブログ でやっているので良かったら見ていってください。

元からある、管理ツールのキーを流用しています。

HKCR\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage

Subcommands (文字列値) を追加します。

キーの既定値にデータがあると動作しないため削除します。

Manage\command キーは、Subcommands があると無視されます。元々存在する管理ツールのコマンドですので、そのままにしてあります。

Manage\shell キー以降は、通常の Shell メニューと同じ構造になっています。

Subcommands を使用する場合は Shell キーの既定値や、"Position"="Top" | "Position"="Bottom" で並び順が指定できませんので、管理が一番上になるように、項目の先頭に数字を付けています。

Manage\shell\01Manage\command管理ツールのコマンドは既定値が展開可能な文字列値でないと動作しません。

さらにもう一つ、ネストすることもできます。

最初の図の設定例です。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage]
@=""
"subcommands"=""

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\01Manage]
"HasLUAShield"=""
"SuppressionPolicy"=dword:4000003c
"MUIVerb"="@%systemroot%\\system32\\mycomput.dll,-400"
"SeparatorAfter"=dword:00000001

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\01Manage\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,43,00,6f,00,\
  6d,00,70,00,4d,00,67,00,6d,00,74,00,4c,00,61,00,75,00,6e,00,63,00,68,00,65,\
  00,72,00,2e,00,65,00,78,00,65,00,00,00
; %SystemRoot%\system32\CompMgmtLauncher.exe

; Device Manager

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\devmgr]
"Icon"="devmgr.dll,4"
@="@devmgr.dll,-4"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\devmgr\Command]
@="mmc.exe /s devmgmt.msc"

; Disk Management

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\Diskmgmt]
@="@dmdskres.dll,-65535"
"Icon"="dmdskres.dll"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\Diskmgmt\Command]
@="mmc.exe diskmgmt.msc"

; Event Viewer


[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\Eventvwr]
@="@miguiresource.dll,-101"
"Icon"="miguiresource.dll,0"
[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\Eventvwr\Command]
@="eventvwr.exe"

; Services

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\Service]
@="@filemgmt.dll,-2204"
"Icon"="filemgmt.dll"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\Service\Command]
@="mmc.exe /s services.msc"

; Task Schedule

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\Taskschd]
@="@miguiresource.dll,-201"
"Icon"="miguiresource.dll,1"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell\Taskschd\Command]
@="mmc.exe /s taskschd.msc"

元に戻す

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage]
@=hex(2):40,00,25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,6f,00,74,\
  00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,\
  79,00,63,00,6f,00,6d,00,70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,\
  00,34,00,30,00,30,00,00,00
"subcommands"=-

[-HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\shell]

コンピューターアイコンに便利な機能を付ける

2011年8月8日月曜日

コンピューターアイコンに便利な機能を付ける 2

メニューにセパレーターを追加すると見栄えが良くなります。

コンピューターアイコンのシェルメニュー

シェルに境界線を付けるには項目のキーに値を書き込みます。

項目のに追加
項目のに追加
項目自体をセパレーターにする
"SeparatorBefore"=dword:00000001
"SeparatorAfter"=dword:00000001
"CommandFlags"=dword:00000008


前回のカスタマイズをした状態で使用例をあげてみます。

ディスクの管理にセパレーターを追加

HKCR\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Diskmgmt


HKCR\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Diskmgmt

項目の前にセパレーターを追加

SeparatorBefore (DWORD値) を追加して値のデータを 1 にします。

"SeparatorBefore"=dword:00000001
セパレーターを上に追加

項目の後にセパレーターを追加

SeparatorAfter (DWORD値) を追加して値のデータを 1 にします。

"SeparatorAfter"=dword:00000001
セパレーターを下に追加

項目自体をセパレーターにする

CommandFlags (DWORD値) を追加して値のデータを 8 にします。

"CommandFlags"=dword:00000008

セパレーターにする


コンピューターアイコンに便利な機能を付ける

2011年8月5日金曜日

コンピューターアイコンに便利な機能を付ける 1.2

大雑把で恐縮ですがカスタマイズした内容の説明です。

HKEY_CLASSES_ROOT\CLSID\ 以下のキーのほとんどは、Windows7 の標準では編集できなくなっていますが、例外として、ごく一部はそのまま編集可能になっています。

コンピューター アイコンの右クリックメニュー
{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell

ごみ箱 アイコンの右クリックメニュー
{645FF040-5081-101B-9F08-00AA002F954E}\shellshellex

これは、この部分に機能を追加する多くのアプリケーションとの互換性を考慮したものと思われます。 前々回にこの部分を使用したのも、煩わしい所有権の変更をする必要がないためです。(Findは見落としていましたが)

CLSID については、一部ですが、MSDN などに載っていますし、キーの既定値からおおよそ推測したりできます。

ShellDevmgrDiskmgmt キーなどは、好きな名前にできます。

HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell

右クリックメニューがこの順番で並びますので、a ,b ,c や 01 ,02 ,03 と付けてみるのもいいかもしれません。任意の順で並べ替えることもできますが、ここでは割愛します。

Devmgrキーなどの 既定値のデータが実際に表示される名前になります。

HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Devmgr

@devmgr.dll,-4 でDLLの中の文字列 (デバイス マネージャー)を指定しています。
リソースツールなどで日本語の文字列を探す場合は、devmgr.dll.mui を調べます。
日本語で「デバイス マネージャー」と入力しても同じ結果になります。
MUIVerb 値を追加するとそちらが優先して表示されます。

MUIVerb

Icon 値でメニューのアイコンを指定しています。

DLLの中の文字列やアイコンはリソースツールなどで調べることもできますが、ほとんどは、Windows が初めから設定している、スタートメニューやレジストリを参考にしています。

例えば、デバイス マネージャーは以下のキーで設定されていますので、それを参考にしました。

HKCR\CLSID\{74246bfc-4c96-11d0-abef-0020af6b0b7a}

Command キーの既定値のデータが実行されるコマンドです。

Command

%SystemRoot%\system32\NOTEPAD.EXEなどにするとメモ帳が起動します。

この、Command キーの既定値や上のデバイスマネージャーの文字表示のところは、通常は文字列値 (REG_SZ)ではなく、展開可能な文字列値 (REG_EXPAND_SZ)になっています。


ブログに載せるのに都合が悪いので文字列値にしていますが、環境変数を使う場合は展開可能な文字列値 でないと動作しません。


コンピューターアイコンに便利な機能を付ける

2011年8月3日水曜日

コンピューターアイコンに便利な機能を付ける 1.1

前回の投稿は、find キーの所有者が TrustedInstaller になっているため、検索のみ登録されませんでした。失礼いたしました。

でもこれおかしいんですよね。

趣味でやっているブログですが、あまりいい加減なことも書けないので、バーチャルマシン → 実機 で少なくとも2回は確認していますが、その時は問題ありませんでした。

再度、調べていたら、レジストリエディタ か Windows なのか判断できませんが、ちょっと変な挙動に気がつきました。

色々な環境での、前回のregファイルの挙動
1. 初回実行でエラーなし findキー以下は未登録。2回目実行でエラー。
2. 他の環境で初回実行でもエラー。

色々な環境での、Shellキーを削除の挙動
1. エラー表示で削除不可。
2. エラー表示後、Shellキーより下のエントリを全て削除。
3. Shellキー が削除される。
4. 他のレジストリエディタで削除不可。

前回の投稿は直前に、この Shell キーの削除の挙動に気がついて書き直したため、バックアップを取っていながら、それを使用していないという変な内容になってしまいました。


下書きで書いた元に戻す方法は
Shellキーを削除(キー自体は削除されない) → バックアップしたregファイルを実行 です。

今回のエラーの報告のために前回の投稿はそのままにしてあります。

Find(検索)の部分を削除するか、少し難しいですが、レジストリキーのフルコントロール権限を、Administrators に与えてもらうと、エラーも出なくなります。

  1. キーの所有者TrustedInstaller から Administrators に変更。
    (アクセス許可 → 詳細設定)

  2. Administratorsフルコントロールにする。

🚀 アクセス権を TrustedInstaller に戻す方法


コンピューターアイコンに便利な機能を付ける

2011年8月1日月曜日

コンピューターアイコンに便利な機能を付ける 1

デスクトップのコンピューター アイコンにメニューを追加する方法です。

コンピューター アイコンにメニューを追加

基本的になんでも追加できますが、今回は管理ツールの中でよく使う、イベントビューア、サービス、タスク スケジューラー、ディスクの管理、デバイスマネージャーを設定します。

HKCR\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shellキーをバックアップ。

HKCR\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell

必要な機能を編集で取捨選択して reg ファイルを実行。

Windows Registry Editor Version 5.00

; Find

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\find]
"LegacyDisable"=-
"Icon"="SearchFolder.dll"

; Disk Management

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Diskmgmt]
@="@dmdskres.dll,-65535"
"Icon"="dmdskres.dll"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Diskmgmt\Command]
@="mmc.exe diskmgmt.msc"

; Device Manager

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\devmgr]
@="@devmgr.dll,-4"
"Icon"="devmgr.dll,4"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\devmgr\Command]
@="mmc.exe /s devmgmt.msc"

; Event Viewer

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Eventvwr]
@="@miguiresource.dll,-101"
"Icon"="miguiresource.dll,0"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Eventvwr\Command]
@="eventvwr.exe"

; Services

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Service]
@="@filemgmt.dll,-2204"
"Icon"="filemgmt.dll"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Service\Command]
@="mmc.exe /s services.msc"

; Task Schedule

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Taskschd]
@="@miguiresource.dll,-201"
"Icon"="miguiresource.dll,1"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Taskschd\Command]
@="mmc.exe /s taskschd.msc"

元に戻す

Windows Registry Editor Version 5.00

; Find
[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\find]
"LegacyDisable"=""
"Icon"=-

; Disk Management
[-HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Diskmgmt]

; Device Manager
[-HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\devmgr]

; Event Viewer
[-HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Eventvwr]

; Services
[-HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Service]

; Task Schedule
[-HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Taskschd]

コンピューターアイコンに便利な機能を付ける