Windowsエクスプローラの右クリックメニューの追加

[戻る]
三浦 2006/05/21(日) 03:59:05
エクスプローラのフォルダ選択右クリックメニューから
あるプログラムを実行したく、レジストリに下記キーを追加しました。
HKEY_CLASSES_ROOT\Folder\Shell\Test\command

確かにエクスプローラのフォルダ選択右クリックメニューで
Testというメニューが追加されるのですが、
タスクバーの「スタート」の右クリックメニューにもTestという
メニューが追加されてしましまい、意図にそいません。

タスクバーの「スタート」の右クリックメニューにはTestを出さない
ようにする方法を教えて頂けませんか。

シャノン 2006/05/21(日) 10:36:40
難しいと思う。
あのメニューは、スタートメニューフォルダに対して出るものと同じだからね。

コンテキストメニューハンドラを書いて、スターとメニューフォルダだけ個別に除外す
れば、できないこともない。
ただし、その場合、スタートボタンではなく、
 C:\Documents And Settings\<UserName>\スタート メニュー
フォルダにもメニューが出なくなってしまうんじゃないかな。

スタートボタンがクリックされたのか、スタートメニューフォルダがクリックされたの
か判別できる方法があるかなぁ…。マウス座標から判断する?

三浦 2006/05/21(日) 12:43:40
ご回答、ありがとうございまうす。

>あのメニューは、スタートメニューフォルダに対して出るものと同じだからね。

スタートの右クリックメニューには、
例えば、「開く- All users(P)」、「エクスプローラ- All users(X)」等があり、
通常のエクスプローラのフォルダ右クリックに対して出るのとは
違うのかな〜と思ったので、思考錯誤していました。
ちなみにWINXP HOMEです。

例えば、「フォルダにコピー」というメニューは、
HKEY_CLASSES_ROOT/AllFilesystemObjects/ContextMenuHandlers/Send To
が出ているようですが、これは、スタートの右クリックメニューには
でてきません。

なんとか、実現方法はないですか?

シャノン 2006/05/21(日) 14:18:13
> 例えば、「開く- All users(P)」、「エクスプローラ- All users(X)」等があり、

それはスタートボタンだけの特別扱いでしょう。
つまり、スタートボタンには、
・「開く- All users(P)」、「エクスプローラ- All users(X)」等が出る
 これはスタートボタンだけの独自メニュー
・加えて、スタートメニューフォルダのメニューが出る
・ただし「送る」「切り取り」「コピー」等は出ない
ということだと。
標準項目の「切り取り」「コピー」「削除」「名前の変更」等を消すのは難しくないと
思うんだけどね…たぶん。

> 例えば、「フォルダにコピー」というメニューは、

ウチのマシンにはこれがありません。何か拡張機能を導入されているのでは?

> HKEY_CLASSES_ROOT/AllFilesystemObjects/ContextMenuHandlers/Send To
> が出ているようですが、

これは「送る」機能だな。こんなキーあったなんて知らなかった。

> これは、スタートの右クリックメニューにはでてきません。

法則性がわかんないなぁ。どうなってんだろ。
HKEY_CLASSES_ROOT \ Directory \ Shell
HKEY_CLASSES_ROOT \ Folder \ Shell
HKEY_CLASSES_ROOT \ AllFileSystemObjects \ Shell
以上3箇所に適当なメニューを追加してみたが、適当なフォルダ、スタートメニューフ
ォルダ、スタートボタンの全てに適用された。

HKEY_CLASSES_ROOT/AllFilesystemObjects/ContextMenuHandlers/Send To
をいじって、メニューが出ないようにしてみると、通常のファイル/フォルダのメニュ
ーから「送る」が消えてしまった。このキーが「送る」メニューを出していることは確
実なんだが…スタートボタンはどうやってこいつを避けているんだろ。
やはり、シェル拡張内で、「現在フォーカスを持っているのがスタートボタンだったら
出さない」という選択を行っているんだろうか。

三浦 2006/05/22(月) 00:32:18
ご回答ありがとう御座います。
どうやってスタートボタンだったらと判断しているかはわかりませんでした。
右クリックメニューの「ウイルス検索実行」も同じようにやっているはずなので、
われわれでも、制御可能なはずだと思います。

最初はレジストリをいじれば簡単にできるのかな〜と期待していましたが、
そんなにあまくないかも知れません。
初心者に近く、全然わかっていませんが、下記方法で実現できるでしょうか。
@クラスIDを決める
Aメニュー拡張用のクラスを作成して、DLLとしてコンパイル
 →QueryContextMenuで何らかの判断をさせる?
Bレジストリに登録

とりあえず、また来週末に調べてみようと思います。

シャノン 2006/05/22(月) 06:49:10
> 右クリックメニューの「ウイルス検索実行」も同じようにやっているはずなので、
> われわれでも、制御可能なはずだと思います。

ほー。何のソフトを使われてます?
ウチの Notron 2005 はスタートボタン右クリックにもスキャンメニューが出ちゃいま
す。

> @クラスIDを決める

フォルダに対するメニュー拡張ならば、クラス ID は Folder か Directory でしょう。

> QueryContextMenuで何らかの判断をさせる?

これが肝要ですね。
どうやって、現在のメニューの対象が「スタートボタンではない」ことを判定している
のか。
スタートボタンではメニューは出てはならず、しかし、スタートメニューフォルダでは
出なければならないというのを、どのように区別するか。

subaru 2006/05/23(火) 13:33:56
IContextMenu::QueryContextMenuに渡されるフラグでは判断するのは強引ですかね?
とりあえずXP、2000環境でスタートボタン右クリックのときは
2(=CMF_VERBSONLY)のみがセットされてくるようですが。
普通のショートカットファイルを右クリックのときは
他のフラグもついてくるようだからもしかしたら判断は可能かも?

>やはり、シェル拡張内で、「現在フォーカスを持っているのがスタートボタンだったら
>出さない」という選択を行っているんだろうか。
この方法を試してみようと思ったのですが
スタートボタンを右クリックしただけではフォーカスが移らないのか、
ボタンが選択状態がある場合でないとうまくいきませんでした。

古いスレッドには追加発言できません。