ハイライトのコンテキスト メニューにもう一度追加しますか?

ハイライトのコンテキスト メニューにもう一度追加しますか?

この質問は以前にもされましたが、答えは「まあ、さまざまなオプションをサポートするかどうかは各アプリケーション次第です」でした。それでも、メモ帳、ブラウザなどで選択項目を右クリックすると、何かがコンテキスト メニューを構築します。アプリはどうやってそれを実行するのでしょうか? なぜ追加できないのでしょうか? ハイライト コンテキスト メニューに追加するにはどうすればよいでしょうか? 答えがないよりは、答えがないほうがましです。

答え1

簡単な答え: 新しいメニュー項目を追加した場合、プログラムは、項目がクリックされたときに何をすべきかわかりません。新しいメニュー項目に何かを実行させるには、実際にプログラムのコードを変更する必要があります。これが、「各アプリケーション次第」が有効な回答である理由です。


Windows は、他のほとんどのオペレーティング システムと同様に、GUI プログラムを構築するための一連の機能を提供します。これらの機能の一部はシステムの一部 (「ウィンドウを作成する」) であり、その他は主に利便性を目的とした機能 (「クリック可能なボタンを描画する」) です。

ほとんどのプログラムは、これらの関数を使用してメニュー (通常メニューとコンテキスト メニュー) を表示します。基本的に、これらの関数は Windows に項目のリストを提供し、それをメニューの形式で画面に表示するように要求し、選択した内容をプログラムに通知します。

Windows では、項目のリストがどこから取得されるかは特に気にしません。一部のメニューはプログラム自体によって生成されます (「最近使用したファイル」リストなど)。これらのメニューを変更するには、最近使用したファイル リストを作成するプログラムの一部を実際に書き換える必要があります。メモ帳の「ファイル」メニューや「編集」メニュー、または「ヘルプ」メニューなどのその他のメニューは、ファイル.exe自体に保存されている「リソース」から作成され、このようなリソースを編集するツールがあります (たとえば、メニュー項目の並べ替えやプログラムのアイコンの変更など)。

しかし、そのようなツールを使用して新しいメニュー項目を追加した場合、プログラムは機能しないため、何をすればいいのか分からない各メニュー項目には魔法は関連付けられておらず、1 つの数字、つまり「コマンド ID」のみが割り当てられています。たとえば、多くのプログラムで共通する「コピー」にはコマンド ID 12 (「IDM_COPY」) が割り当てられており、1 つのプログラムに固有のもの (「新しいゲーム」など) には 1234 や 2468 などが割り当てられている可能性があります。コンテキスト メニューを開いて「コピー」をクリックすると、Windows はメモ帳に「コマンド ID 12 が選択された」ことだけを伝え、実際に選択されたテキストをクリップボードにコピーするのはメモ帳次第です。

  • 切り取り → ID 11 → メモ帳はテキストをクリップボードに置き、ドキュメントから削除します
  • コピー → ID 12 → メモ帳がテキストをクリップボードに保存します
  • 貼り付け → ID 13 → メモ帳はクリップボードからテキストを取得し、それをドキュメントに挿入します
  • 歌う → ID 12 → メモ帳がテキストをクリップボードに保存する
  • もう一度コピー → ID 3456 → メモ帳は何もしません。ID 3456 が何を意味するのか分からないからです。

補足: 上記は少し簡略化されています。メモ帳のコンテキスト メニューは、実際には「編集可能なテキスト」コントロールによって実装されており、これは Windows が提供する前述のユーティリティ機能の一部です。ただし、メイン メニューは完全にメモ帳の一部です。

補足: 一部のプログラム (通常はスキンやテーマを設定できるもの) は、実際にさまざまなコントロールを独自に描画します。ポップアップ メニューはタイトル バーのないウィンドウにすぎないため、これは特に難しいことではありません。私自身はそのようなプログラムのコードを見たことはありませんが、詳細はあまり変わらないと思います。

関連情報