5

したがって、Windowsメッセージを監視するためにC#アプリケーションで使用しているC++dllがあります。C#アプリケーションからは表示されないため、WM_CLOSEとWM_QUERYENDSESSIONが送信されているかどうかを知りたいです。これらのメッセージの1つを受け取った場合、ファイルをクリーンアップしたいのですが、問題は、TMでファイルを強制終了すると、関数が機能しないことです。メッセージが届かないのは継ぎ目です。問題は、タスクマネージャーがC ++ dllではなくC#アプリにメッセージを送信することだと思います。

いくつかのコード:

c ++:

typedef void (*CLOSING_FUNCTION)();
CLOSING_FUNCTION myClosingFunction;

typedef void (*SHUTDOWN_FUNCTION)();
SHUTDOWN_FUNCTION myShutdownFunction;

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {

    case WM_CREATE:
        return 0;

    case WM_CLOSE:
        myClosingFunction();
        return 0;

    case WM_QUERYENDSESSION:
        myShutdownFunction();
        return 1;

    case WM_DESTROY:
        myClosingFunction();
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

c#:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Close_Function();
private static Close_Function myCloseDelegate;

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void Shutdown_Function();
private static Shutdown_Function myShutdownDelegate;
static void StartMonotoring()
{
       myCloseDelegate = Close;
       myShutdownDelegate = Shutdown;

       InterceptMessages(myCloseDelegate, myShutdownDelegate);
}

static void Close();
static void Shutdown();
4

1 に答える 1

3

プロセスが強制終了された場合に備えて、プロセスはメッセージを受け取りません。TerminateProcessで開始します-私のハイライトを参照してください:

TerminateProcess関数は、プロセスを無条件に終了させるために使用されます。ExitProcessではなくTerminateProcessを使用すると、ダイナミックリンクライブラリ(DLL)によって維持されるグローバルデータの状態が損なわれる可能性があります。

この関数は、プロセス内のすべてのスレッドの実行を停止し、保留中のすべてのI/Oのキャンセルを要求します。

編集:タスクの終了方法に関するHans Passantのコメント-タスクマネージャーの[アプリケーション]タブを使用する場合にのみ、WM_CLOSEを取得します。[プロセス]タブからそれを強制終了することは失礼な終了です(TerminateProcess)。

于 2012-05-22T16:51:32.053 に答える