2023年8月16日水曜日

移動とコピーを SubCommands でコンテキストメニューに実装する

移動とコピーをコンテキストメニューに付ける の第二弾です!

SubCommands を使って簡単に実装します。

というのが建てまえで、SubCommands の問題点をレポートします。

  1. レジストリキーを作成。organize は任意の名前です。

    HKCU\SOFTWARE\Classes\AllFilesystemObjects\shell\organize

  2. organize キーへ値を設定します。

    • Icon (文字列値) : shell32.dll,-16753

    • MUIVerb (文字列値) : @shell32.dll,-31411

    • SubCommands (文字列値) : Windows.CopyToBrowser;Windows.MoveToMenu

    subcommands

  3. AllFilesystemObjects キーへ戻り、SeparatorBeforeAndAfter (文字列値) を作成します。

    SeparatorBeforeAndAfter

完成図

move-copy-contextmenu-choose-folder-moveto.png 項目のコピー
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Classes\AllFilesystemObjects]
"SeparatorBeforeAndAfter"=""

[HKEY_CURRENT_USER\SOFTWARE\Classes\AllFilesystemObjects\shell\organize]
"Icon"="shell32.dll,-16753"
"MUIVerb"="@shell32.dll,-31411"
"SubCommands"="Windows.CopyToBrowser;Windows.MoveToMenu"

解説

SubCommands のデータが呼び出す機能です。

Windows.CopyToMenu がコピー先のみ、Windows.CopyToBrowser が場所の選択を表示する大きい画面です。

Windows.CopyToMenu

Windows.CopyToBrowser

移動も同様に、Windows.MoveToMenuWindows.MoveToBrowser に該当します。

今回のカスタマイズを Windows.CopyToBrowserWindows.MoveToBrowser に揃えると2階層目のメニューでどちらか判断できません。

場所の選択…

それでは、Windows.CopyToMenuWindows.MoveToMenu はというと、実はこの組み合わせは動作しないのです。

SubCommands メニュー表示
Windows.CopyToBrowser Windows.CopyToMenu 2つメニューが出る
Windows.CopyToBrowser Windows.CopyToBrowser 2つメニューが出る
Windows.CopyToBrowser Windows.MoveToBrowser 2つメニューが出る
Windows.CopyToBrowser Windows.MoveToMenu 2つメニューが出る
Windows.CopyToMenu Windows.CopyToMenu コピー(Menu)のみ
Windows.CopyToMenu Windows.CopyToBrowser コピー(Menu)のみ
Windows.CopyToMenu Windows.MoveToMenu コピー(Menu)のみ
Windows.CopyToMenu Windows.MoveToBrowser コピー(Menu)のみ

CopyToMoveTo へ置き換えても結果は同じ。ToMenu が先頭にあると、その項目しか表示されない。

Shell で実装しても同じ。REG_EXPAND_SZ 値にしても同じ。HKLM に設定しても同じ結果です。

何かの知識が不足しているとは思いますがコンソールをまとめてカスケードメニューにする記事でも動かない組み合わせがあり、調べてみると、該当箇所でバッファオーバーフローが発生しており、バグの疑いも残ります。

そもそもSubCommandsはエクスプローラーのリボンで利用されており、メニューで使うことは想定されていないのでしょう。

といっても、実際にメニューで使えることは間違いないので、動作しないパターンがあるのを踏まえて、試しながら実装するしかありませんね。