5

実行中のすべてのアプリケーションを列挙する必要があります。特に、すべてのトップ ウィンドウ。そして、すべてのウィンドウで、カスタム項目をそのウィンドウのシステム メニューに追加する必要があります。

C++でそれを達成するにはどうすればよいですか?

アップデート。

Windows、MacOS、および Ubuntu 用のソリューションがあれば幸いです (ただし、MacOS と Ubuntu に「システム メニュー」などがあるかどうかはわかりません)。

4

4 に答える 4

8

Windows の場合、最上位のウィンドウを取得する別の方法 (コールバックを使用する EnumWindows 以外) は、デスクトップの最初の子を取得してから、そのすべての兄弟を取得することです。

HWND wnd = GetWindow(GetDesktopWindow(), GW_CHILD);
while (wnd) {
    // handle 'wnd' here
    // ...
    wnd = GetNextWindow(wnd, GW_HWNDNEXT);
}

システムメニューの取得に関してはGetSystemMenu、第 2 引数として FALSE を指定して関数を使用します。他のGetMenu回答で言及されているのは、通常のウィンドウメニューを返します。

ただし、外部プロセスのウィンドウにカスタム メニュー項目を追加するのは簡単ですが、その項目の選択に応答するのは少し難しいことに注意してください。ウィンドウをサブクラス化できるようにするためにプロセスに何らかのコードを挿入するか、メッセージを監視するためにグローバル フック (おそらく aWH_GETMESSAGEまたはtype) をインストールする必要があります。WH_CBTWM_SYSCOMMAND

于 2008-09-26T11:34:26.950 に答える
1

別のウィンドウのトップ レベル ハンドルを取得したら、 GetMenu()を呼び出してウィンドウのシステム メニューを取得し、それを変更できる場合があります。次に例を示します。

HMENU hMenu = GetMenu(hwndNext);
于 2008-09-26T10:34:37.813 に答える
0

EnumWindows()を使用して、最上位の Windows を列挙できます。

質問の 2 番目の部分に対する具体的な回答はありませんが、ウィンドウをサブクラス化すると、システム メニューを変更できると思います。

編集: またはクリスが言ったことを行う: GetMenu() を呼び出す

于 2008-09-26T10:37:10.723 に答える
0

Re: 更新 - Microsoft Windows でさえ、Windows にシステム メニューが必要ではないことに注意してください。GetMenu( ) は 0 を返す場合があります。ウィンドウの作成もインターセプトする必要があります。これは、新しいトップ ウィンドウごとにおそらく必要になるためです。

また、あなたが提案するものは、他のアプリケーションにとってかなり邪魔です。メニューを変更するときに壊れないようにするにはどうすればよいですか? また、メッセージを確実に抑止するにはどうすればよいでしょうか? 特に、他の誰かに見られる前に、それらを傍受するにはどうすればよいでしょうか? Raymond Chen の言葉を引用すると、2 つのプログラムがそれを試みたらどうなるか想像してみてください。

于 2008-09-26T11:11:31.250 に答える