2013-07-02 92 views
5

我目前正在使用一個功能的程序,當其他進程的窗口正在最大化/最大化時應該會提醒我。對於最大化事件,我的意思是按下右上角關閉按鈕旁邊的符號。SetWinEventHook窗口最大化事件

要完成此操作,我使用SetWinEventHook函數。問題是我無法找到正確的事件代碼來捕獲此事件。我嘗試了EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND, EVENT_SYSTEM_MINIMIZESTART and EVENT_SYSTEM_MINIMIZEEND常量,但它們似乎都沒有觸發最大化事件。然而,我可以跟蹤其他事件,所以我的SetWinEventHook的實現工作。

有沒有人maby有關於如何從其他進程捕獲最大化事件的想法?

在此先感謝。

有了友好的祝福, 鮑勃

代碼示例:

// 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 
    } 
} 
+0

什麼用'和SetWindowsHookEx「的? – bash0r

+0

您可以等待調整大小事件,然後檢查它是否填滿整個屏幕? – tbridge

+1

必須有更好的方法,但CBT鉤子可以捕捉到。 – chris

回答

0

Windows不火最大化的事件。還有其他的方法,但他們很討厭,我不會推薦他們。

2

SetWinEventHook()的回調,處理EVENT_OBJECT_LOCATIONCHANGE事件,並檢查窗口處於最大化狀態通過調用GetWindowPlacement()功能和它的第二個參數的showCmd屬性與SW_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. 
     } 
    } 
}