7

現在、他のプロセスのウィンドウが最大化/最大化されているときに警告する機能を使用するプログラムに取り組んでいます。最大化イベントとは、右上隅の閉じるボタンの横にある記号を押すことを意味します。

これを実現するために、SetWinEventHook関数を使用します。問題は、このイベントをキャッチするための正しいイベント コードが見つからないことです。定数を試してみましたEVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND, EVENT_SYSTEM_MINIMIZESTART and EVENT_SYSTEM_MINIMIZEENDが、すべてが最大化イベントでトリガーされないようです。ただし、SetWinEventHook の実装が機能するように、他のイベントをトレースできます。

他のプロセスから最大化イベントをキャプチャする方法を知っている人はいますか?

前もって感謝します。

友好的な挨拶で、ボブ

コード例:

// To catch the event
SetWinEventHook(EVENT_MIN, EVENT_MAX, IntPtr.Zero, new WinEventDelegate(WinEventProc), GetProcess(), 0, 0);

// The handler
private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
    // TODO: Filter maximize event here   
    if (eventType == ?)
    {
            // Do something
    }   
}
4

2 に答える 2

5

SetWinEventHook()のコールバックでイベントを処理し、関数を呼び出してその 2 番目の引数のプロパティを定数と比較することEVENT_OBJECT_LOCATIONCHANGEにより、ウィンドウが最大化された状態かどうかを確認します。GetWindowPlacement()showCmdSW_SHOWMAXIMIZED

C++ の例:

void CALLBACK exampleHook(HWINEVENTHOOK hook, DWORD event, HWND hWnd,
    LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
    if (EVENT_OBJECT_LOCATIONCHANGE == event) {
        WINDOWPLACEMENT wp;
        wp.length = sizeof(WINDOWPLACEMENT);
        GetWindowPlacement(hWnd, &wp);

        if (SW_SHOWMAXIMIZED == wp.showCmd) {
            // Window is maximized.
        }
    }
}

Fwiw、私はExplorerHiDpiFixユーティリティでこのアプローチを使用しました。

于 2015-12-31T17:39:56.843 に答える
0

Windows は最大化イベントを発生させません。他にも方法はありますが、かなり厄介なのでお勧めしません。

于 2013-07-02T22:44:58.963 に答える