トップ回答者
全ファイルに右クリック登録をしてから、特定の拡張子の右クリック登録だけを解除する方法

質問
-
初の書き込みをします。 はじめまして。
一般ファイルのショートカットのアイコンを除く、
ユーザーが編集できる全てのファイルのアイコンの右クリックメニューに
自作アプリの表示をさせたいです。現在は、 HKEY_CLASSES_ROOT\*\shell\自作アプリ としているのですが、
このままだと ".lnk" な拡張子のアイコンの右クリックメニューにも
自作アプリが登録されてしまい、困っています。HKEY_CLASSES_ROOT\ 以下の .(ドット) で始まるディレクトリをすべて検索して、
.lnk 以外のサブキー下のshellに登録することも考えたのですが、
自作アプリ内での処理が複雑になりそうなので、 保留にしています TTそこで、
1: HKEY_CLASSES_ROOT\*\shell\自作アプリ としてから、
HKEY_CLASSES_ROOT\.lnk (\lnkfile ?) に、何らかの登録をする2: HKEY_CLASSES_ROOT 以下の、
ショートカット以外の編集可能ファイルの右クリックメニュー
に自作アプリを表示できる場所に登録をするなど、レジストリへの登録の仕方で解決する方法を探しています。
どなたか、 方法をご存じの方がいらっしゃいましたら、教えて下さい m(_ _)m
回答
-
Community のスレッド の続きですね。
正直なところ、そんな細かい設定はないと予想しています。
このため、やるとすれば、全ファイル(* など)に対して関連づけたシェル拡張 DLL を作り、その中でメニューを追加する・しないを判別するという方向性でしょうか。
その場合、COM の知識が求められますので、相当に難易度が上がる点にご留意ください。
- 編集済み AzuleanMVP, Moderator 2014年5月9日 15:46
- 回答の候補に設定 星 睦美 2014年5月12日 6:58
- 回答としてマーク koujichiu 2014年5月14日 12:15
すべての返信
-
Community のスレッド の続きですね。
正直なところ、そんな細かい設定はないと予想しています。
このため、やるとすれば、全ファイル(* など)に対して関連づけたシェル拡張 DLL を作り、その中でメニューを追加する・しないを判別するという方向性でしょうか。
その場合、COM の知識が求められますので、相当に難易度が上がる点にご留意ください。
- 編集済み AzuleanMVP, Moderator 2014年5月9日 15:46
- 回答の候補に設定 星 睦美 2014年5月12日 6:58
- 回答としてマーク koujichiu 2014年5月14日 12:15
-
こんばんは。
返信が遅くなってしまいました m(_ _)m
私は、まだ、フォームにボタンやテキストボックスを並べて、
そのまま .hファイル に色々と挙動を書くというレベルから抜け切れていませんで、
COMとwin32APIの区別や、 それらをC++/CLI上で相互に変換しながら変数を利用
していくようなことができないです。ですので、 できれば例えば、 レジストリのPoliciesにNoDrivesInSendToMenu
と追加書きをすればリムーバブルドライブを 「送る」 のメニューから取り除ける
というような、 「Noなにがし」 のような設定で、レジストリへの登録で解決できると
良いのですが (´うω;`)// Windowsスマートチューニング (21) Vista編: <送る>メニューをカスタマイズして使い勝手を良くする | マイナビニュース
// http://news.mynavi.jp/column/windows/021/ともかくも、 いただきましたご回答を参考にしまして、
もっといろいろなソフトを作って知識を深めて行きたいとおもいます。 -
そういうシナリオを想定していないということかもしれません。
Community でも MSDN Forums でも特に他の意見がついていないことから、ほとんど知られていないか、存在しない可能性が高いと考えられます。
(すべてに登録したいのに一部だけ排除という用途は数パーセントに満たないはずなので)なお、シェル拡張を作るとしても C++/CLI や C# などの .NET 関連のコンポーネントは避けた方がよいとされています。
.NET 4 世代からは CLR の問題が解消したといえども、引き続き not supported というスタンスが変わっていないためです。
このため、純粋な C++ で作る必要があります。// そもそも、シェル拡張と .NET アプリを連携させるのに、C++/CLI は MUST ではありません。
// シェル拡張がコマンドライン引数に指定してアプリを起動すればよいので。 -
-
「7-Zip」 や 「送る」 というサブキーは、 作った人が複雑にレジストリに登録をして実現させているようですが、
私にはそんな腕がありませんので、「レジストリへの登録のやり方をちょっと工夫すれば、実は簡単にショートカットへの登録だけは除外できる」
というようなことは無いだろうかとがんばって調べていて、その一環として
コミュニティのスレッドやこちらのMSDNにも質問をさせてもらっているものです (o_ _)oちなみに、 右クリックメニューの「送る」に登録をしたり、その内容を変更するということも
つい最近知ったばかりでした @@;余談ですが、右クリックメニューの「送る」のなかの選択項目から ネットワークドライブ を削除したいのですが、
なかなかできません。。。(泣 -
「レジストリへの登録のやり方をちょっと工夫すれば、実は簡単にショートカットへの登録だけは除外できる」
というようなことは無いだろうかとがんばって調べていて、その一環として
コミュニティのスレッドやこちらのMSDNにも質問をさせてもらっているものです (o_ _)o絶対にないとは断言できませんが、存在しない可能性は高そうです。
これを否定して、よい情報を持ち寄る人を待つこともできますが、時間をかけて待っても、自分で調べても見つからなければ、残念ながら「できない」と考えて方向性を考え直してください。
あるいは、お金を払って Microsoft の有償サポートに頼って、できる・できないを明言してもらうかですが…、どうしても白黒はっきりつけたい場合は検討してください。
余談ですが、右クリックメニューの「送る」のなかの選択項目から ネットワークドライブ を削除したいのですが、
なかなかできません。。。(泣このレベルの質問は Microsoft Community ネタかと思いますが、Windows キーを押しながら R キーを押して「名前を指定して実行」の画面を出していただき、shell:sendto と打ち込んで Enter キーを押してください。
こうすると、送るメニューに表示するショートカットを格納するフォルダーが開きますので、いらないショートカットを消すか、別のフォルダーに移動してください。
逆にこのフォルダーに新しくショートカットを配置すると、次回から「送る」に表示されるようになります。 -
あまり納得されていなさそうだったので、改めてできない旨を説明しようとしていたら、逆に実現方法を見つけてしまいました。おそロシア
右クリックメニューに関するドキュメントはShortcut (Context) Menus and Shortcut Menu Handlersにまとめられています。この中にChoosing a Static or Dynamic Shortcut Menu Methodという項目があります。質問者さんはメニュー項目を動的に切り替えたいわけですからDynamic Verb Methodsになります。
私(およびAzuleanさんもきっとこれ?)の提案していたCOMを使用した方法はIContextMenuを想定していましたが"Discouraged"とのことであまりお勧めはできなさそうな方法でした。
改めてPreferred Dynamic Verb Methodsを確認すると1番目から質問者さんの希望に合致しそうなStatic verb (listed in the previous table) + Advanced Query Syntax (AQS)が挙げられています。この方法は簡単に言えば、検索条件を指定しておくことで、合致したファイルに対してのみメニューを表示することができます。その書式はエクスプローラー右上の検索ボックスと同等です。
Getting Dynamic Behavior for Static Verbs by Using Advanced Query Syntaxにその方法が説明されています。(こちらだと説明が簡略化されてしまって何を言っているかわからなくなっています。)
結局、レジストリにキー HKEY_CLASSES_ROOT\*\shell\自作アプリ、名前 AppliesTo、値 「希望する検索条件」と記述することで実現できそうです。
なお、検索条件はAdvanced Query Syntaxという書式で、使用可能なプロパティはWindows Propertiesとなります。
# 主にSystem辺りを使うことになるかな? System.FileExtension:NOT lnk ではダメだったのでもう少し頭をひねる必要がありそうです。 -
こんにちは、 いろいろと面倒をみていただき、ありがとうございました。
/////////////////////////////////////////////////////////////////////////////////
> よい情報を持ち寄る人を待つこともできますが、時間をかけて待っても、自分で調べても見つからなければ、
> 残念ながら「できない」と考えて方向性を考え直してください。おっしゃられている通り、どこかで区切りを付けないと前に進めませんですね。
このあたりの判断は、とにかくいろいろなソフトを作ってみて勘を磨いていくしかなさそうですが (^^;)/////////////////////////////////////////////////////////////////////////////////
> あまり納得されていなさそうだったので
現状では、私がwindowsの仕組みやそれを利用したプログラムの設計方法などの知識が非常に乏しいせいで、
せっかく回答して下さった方々のおっしゃられている内容が理解できないため、
そのように思われてしまったのでしょう orz
(便利そうなソフトから手を出す → HTML, シェルスクリプト, UWSC → フォームアプリ → 今ここ)
つまり、超高級言語? から手を出してしまい、
アセンブリ言語とはいわずともC言語などで直接WinAPIまわりを扱う機会が無かった。/////////////////////////////////////////////////////////////////////////////////
> レジストリにキー HKEY_CLASSES_ROOT\*\shell\自作アプリ、名前 AppliesTo、値 「希望する検索条件」
> と記述することで実現できそうです。ありがとうございます。
レジストリ全体のバックアップ.regを作ってから、レジストリエディタで 値の名前として
「AppliesTo」 を含むいろいろな追加命令書式で検索をしまして、 使用例を参考にしながら調整
して行きたいと思います m(_ _)m -
途中経過です
HKEY_CLASSES_ROOT\*\shell\自作アプリ、名前 AppliesTo、値 System.FileExtension:=NOT png
で、pngな画像のアイコンだけを登録から外すことができました。しかし、ショートカットアイコンに対して
System.FileExtension:=NOT lnk NOT lnkfile
でうまく行きませんでしたまたまた余談ですが、「送る」メニューからネットワークドライブを消すやり方は、
NoDrivesInSendToMenuの値に文字列値で "1" を入れていたので失敗したのでした
DWORDじゃないとだめ (◞‸◟) -
HKEY_CLASSES_ROOT\*\shell\自作アプリ、名前 AppliesTo、値 System.FileExtension:=NOT png
で、pngな画像のアイコンだけを登録から外すことができました。私も、佐祐理さんも前述しましたが、ItemName, Kind あたりは、ショートカットの指し示す先のファイルの情報になっているようなので、一筋縄にはいきません。
たとえば、メモ帳(Notepad.exe)のショートカットを用意し、System.ItemName:NOT "Notepad.exe" とした場合、そのメモ帳のショートカットではそのメニューが出現しなくなります。
ということは、ショートカットそのもののプロパティではなく、ショートカットの指し示す先(リンク先)のプロパティで AppliesTo が解釈されていることを裏付けています。あり得るとしたら、端っこの方の目立たないプロパティでなら判別できるとか、あるいはまだ見えていないショートカット自体を条件にするための特別な仕組みとなるはずです。
-
*.lnkなファイルを見に行く = その本体のファイルを見に行く という仕掛けが作られてしまっているため、
Windowsの起動後に自作アプリケーションが *.lnkファイルにアクセスをしても
(うまく見破れなくて) 本体のファイルに誘導されてしまうのかもしれませんね。
(実際自作アプリの引数には *.lnkファイルが入ってこないです)//////////////////////////////////////////////////////////
標題にかかげました問題は、追加設定でほぼ解消できることがわかりましたので、この質問はこれで終了とさせてください。
回答していただいた方々には、 長い間おつきあいいただき ありがとうございました m(_ _)m
ショートカットに関しましては、 当方のWindowsへの理解がもっと進んでから、
別の形で質問ができるといいなと思います(^^)