4

残念ながら、WM_QUERYENDSESSIONをリッスンするときに、ユーザーが再起動またはシャットダウンを要求した場合、情報は取得されません。これは本当に悪い設計ですが、Windowsのやり方なので、システムに再起動またはシャットダウンを実行するように指示するパラメーターを取得するNTShutdownSystemへの呼び出しをフックすることを考えていました。

問題は、これをC#で実際にどのように達成できるかということです。NTShutdownSystemに渡されるパラメーターを判別するために使用できるある種のフックを取得し、その情報を保存したいと思います。その後、ユーザーが意図したとおりに「実際の」NTShutdownSystemと呼びたいと思います。

これを説明するサンプルコードはありますか?

4

1 に答える 1

1

シャットダウンの理由WM_QUERYENDSESSIONが表示されない理由は、ユーザーがシステムをシャットダウンするのではなく、その時点でログアウトしている可能性があるためです。

これは通常、カーネル レベルのフックのカテゴリに分類され、システムの安定性に影響を与える可能性があるため、一般的には良いこととは見なされていません。それらのほとんどは C または C++ で書かれており、通常、実行中のすべてのプログラムにわたってフックを実行するために多くの労力を費やす必要があります。たとえば、プログラムのロード時にルーチンをフックします。

これは些細なことではありませんが、マネージ コード (C# など) を使用してこのようなルーチンをフックしようとするのに役立つように作成されたフレームワークがいくつかあります。

次の質問は、なぜ気にするのかということです。

edit NTShutdownSystem は、シャットダウン プロセスの非常に遅い段階で呼び出されます。その時点では、おそらく UI がなく、何もする方法がありません。ExitWindowsExInitiateShutdownInitiateSystemShutdown、およびInitiateSystemShutdownExをインターセプトすることをお勧めします - それらのいくつかが他のものから呼び出されているかどうかはわかりませんが、おそらく理由のみを記録してから、WM_QUERYENDSESSION標準アプリのコードで理由に対応する必要があります。

于 2012-05-30T10:53:57.200 に答える