1

アプリケーションの起動直後と終了直前にいくつかの操作を実行する必要があります (UMDH を使用したある種の自動メモリ リーク検出)。

すべてのプロセスに挿入される DLL を準備し、DLL_PROCESS_ATTACH で最初の操作を実行しています (アプリケーションの起動直後)。これで、問題のこの部分は解決されました。

問題は 2 番目の部分にあります。プロセスが終了しようとしているときに操作を実行します。

DLL_PROCESS_DETACH で試してみましたが、これでは遅すぎます。以前にフックする必要があります。

Windows フック メカニズムを使用して、WH_GETMESSAGE にフックしました。

hhk = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) &GetMsgProc, NULL , GetCurrentThreadId());

GetMsgProc() 関数:

LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
  if( nCode == HC_ACTION )
  {
        PMSG msg = (PMSG) lParam;
        if( msg->message == WM_CLOSE )
        {
              OutputDebugString(L"WM_CLOSE");
        }
        if( msg->message == WM_QUIT )
        {
              OutputDebugString(L"WM_QUIT");
        }
        if( msg->message == WM_DESTROY )
        {
              OutputDebugString(L"WM_DESTROY");
        }
  }
  return CallNextHookEx(hhk, nCode, wParam, lParam);
}

しかし、この方法を使用すると、WM_CLOSE メッセージのみが検出されます (「X」ボタンを使用してアプリケーションを閉じるとき)。WM_QUIT メッセージを検出しない理由がわかりません。

アプリケーションが終了しようとしているときにいくつかの操作を実行する方法はありますか?

(私は回り道について知っていますが、私のプロジェクトでは使用できません...)

4

1 に答える 1

1
  1. WH_CALLWNDPROCに加えてみてくださいWH_GETMESSAGE。そのため、アプリのメイン ウィンドウを受け取るWM_DESTROYと、これはフラグである可能性があります。

  2. 理想的には、メインアプリウィンドウのウィンドウプロシージャをオーバーライドする必要があると思います(可能であれば)。みたいな

  3. WM_QUITメッセージはウィンドウ プロシージャによって処理されません。GetMessage見るとWM_QUIT返ってきますFALSE。だから、これが問題かもしれません。IAT テーブル (インポート) を変更して、GetMessage[A/W] プロシージャをオーバーライドすることを試みることができます。

    WNDPROC gpfnOldProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)YourWndProc);
    
于 2012-07-25T18:33:51.930 に答える