0

特定のウィンドウが閉じないように「保護」したかったのです。そこで、WM_CLOSE、WM_DESTOY、または WM_QUIT をフックしたいと考えました。そして、これは私がそうしようとしたものです:

LRESULT CALLBACK WindowHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
        MSG* msg = (MSG*)lParam;
        //if (msg->hwnd == GetForegroundWindow())
        {
            if (msg->message == WM_CLOSE || msg->message == WM_QUIT || msg->message == WM_DESTROY)
            {
                //MessageBox(0, "TEST", "", 0);
                msg->message = 0;
                CallNextHookEx(hMsg, nCode, (WPARAM)NULL, (LPARAM)NULL);
                return TRUE;
            }
        }
    }

    CallNextHookEx(hMsg, nCode, wParam, lParam);
}

私は試した:

  • TRUE または FALSE を返す
  • LPARAM として NULL を指定して CallNextHookEx を呼び出すか、msg->message を 0 に編集する

また、WH_GETMESSAGE をフックしても、メッセージ ループが「ブロック」されないことに気付きました。ただし、WH_CALLWNDPROC をフックすることでこれを行います。これは、msg->message が WM_CLOSE の場合にメッセージ ボックスを表示することで発見しました。

よろしくお願いします。

4

2 に答える 2

1

フックをインストールしようとする代わりに、ウィンドウをサブクラス化し、サブクラスWndProcWM_CLOSEに他のすべてのメッセージを転送している間無視させます。

やめようとすることはできませんし、やめるべきではありませんWM_QUIT。ロドリゴが指摘したように、あなたは何もできませんWM_DESTROY。その時点で、DestroyWindowはすでに呼び出されており、あなたがそれを好むかどうかにかかわらず、あなたのウィンドウは消えていきます。

于 2012-12-17T14:18:35.163 に答える
1

WH_GETMESSAGE は、メッセージ キューから取得されたメッセージのフックをインストールします。メッセージを変更することはできます。しかし問題は、WM_CLOSE が PostMessage() でメッセージ キューにポストされず、SendMessage() で送信されることです。このフックは見えません。

WH_CALLWNDPROC は、ウィンドウ プロシージャが呼び出される直前に実行されるフックをインストールします。これにより、WM_CLOSE が表示されます。ただし、メッセージを変更したり、非表示にしたりすることはできません。

やりたいことをやらせてくれるフックはありません。代わりに、ウィンドウ プロシージャをサブクラス化する必要があります。独自のカスタム ウィンドウ プロシージャが、ウィンドウ自体のプロシージャの前に呼び出されるようにします。これで、古いウィンドウ プロシージャを呼び出さないだけで、WM_CLOSE を簡単にフィルター処理できます。

SetWindowsHookEx() が提供するのと同じ種類の配管が必要であることに注意してください。ウィンドウ プロシージャを含む DLL をプロセスに挿入する必要があります。最善の方法は、SetWindowsHookEx を引き続き使用して、それ以外の場合は何もしないダミー フックでそれを行うことです。

于 2012-12-17T15:03:32.090 に答える