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.MoveToMenu と Windows.MoveToBrowser に該当します。

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

場所の選択…

それでは、Windows.CopyToMenu と Windows.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)のみ

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

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

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

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

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