したがって、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();