1

CreateProcess 内で新しく割り当てられたコンソールとは対照的に、NT キャラクター モード アプリケーションは、そのコンソールが親プロセスから継承されているかどうかをどのように判断できますか?

うわー、人気のないタグ!適切なプログラマーを引き付けるためのウィンドウの追加


@anonymous downvoter: いくつかのフィードバックのみに基づいて、この質問を限定的に拡張できます。不明な点を述べてください (ただし、Windows カーネルとサブシステムに精通している必要があります)。ここにいる私たちの多くはプログラマーであるため、私たちのユーモアは非常に具体的であり、タイトルの駄洒落を過度に判断しないでください。

4

1 に答える 1

2

役立つかもしれないし、役に立たないかもしれないいくつかのアイデア - これは実際には答えではありませんが、長すぎてコメントに収まりません.*

GetConsoleWindow() を使用して、コンソールの HWND を確認できます。他の誰かがそれを共有しているかどうかを確認できます。その上で GetWindowThreadProcessId を呼び出してみてください-Windowsの一部のバージョンでは、正しく思い出せば、これはCSRSSプロセスのPIDを返すようです-これは役に立ちません。しかし、Win7 では、そのウィンドウを最初に所有するプロセスの PID を返すようです。

たとえば、CMD ウィンドウを開始し、さらに入力しました。したがって、同じウィンドウを共有する cmd.exe と more.exe があります。Spy++ は、HWND が cmd.exe に属することを報告します。

ただし、「さらに開始」を使用して、より多くの新しいコンソールを作成すると、spy++ は新しいウィンドウが more.exe に属していることを報告します。

ただし、これは Win7 の新しい動作である可能性があります (または、少なくとも以前のバージョンでは一貫していない可能性があります)。コンソール ウィンドウは、実際にはヘルパー プロセス (Win7 では conhost.exe、以前のバージョンでは csrss) によって所有されています。以前のバージョンでは、GetWindowThreadProcessId がこれらのヘルパー プロセスの PID を返す可能性があります。そして、それが Windows の将来のバージョンで何を返すかは誰にもわかりません。コンソール ウィンドウは「特別」です。

--

GetWindowThreadProcessID に依存しない別のアプローチは次のとおりです。

  • 親のプロセス ID を特定します (この質問に対する過去の回答については、stackoverflow を確認してください!)
  • AttachConsole(pid)、GetConsoleWindow()、および FreeConsole() を使用して、親プロセスが使用しているコンソール HWND (存在する場合) を「覗き見」ます。
  • これの難点は、プロセスは一度に 1 つのコンソールにしかアタッチできないということです。そのため、別のヘルパー プロセス (!) でこの「ピーク」を行う必要があります。最初にコンソール。

要するに、これを概算することは可能かもしれませんが、実際に「実際に」やりたいかどうかは明らかではありません。「パラメータがない場合は一時停止」が最善の方法です。

[*この回答は娯楽目的でのみ提供されており、禁止されている場合などは無効です]

于 2011-05-25T09:32:59.327 に答える