替換窗口消息處理過程

參考:https://jocent.me/2017/06/20/outlook-close-minimize.html

HWND hWndOutlook = FindWindowEx(NULL, NULL, TEXT("rctrl_renwnd32"), NULL);

使用GetWindowLongPtrSetWindowLongPtr對窗口的處理過程進行一個重定向,

在重定向的窗口過程裏截獲WM_CLOSE消息,將該消息轉換爲WM_SYSCOMMAND

// 獲取原來的窗口處理過程並保存下來,留待以後恢復用
LONG_PTR oldWndProc = GetWindowLongPtr(hWndOutlook, GWLP_WNDPROC);       

WNDPROC newWndProc = NewWndProc;
// 實現了窗口過程的重定向,以後每次Outlook有消息要處理,
// 都必須得先經過我們自己實現的NewWndProc纔行 
SetWindowLongPtr(hWndOutlook, 
    GWLP_WNDPROC, 
    reinterpret_cast<LONG_PTR>(newWndProc));   

// 我們自己的窗口過程
LRESULT CALLBACK NewWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_CLOSE) 
    {
        int ret = ::MessageBox(hWnd, 
            L"是否要退出OutLook? 退出後將無法收到郵件", 
            L"Jocent溫馨提醒", 
            MB_YESNO | MB_DEFBUTTON2);
        // 當用戶點擊 【不】退出Outlook時,將WM_CLOSE消息轉換爲 WM_SYSCOMMAND 消息,
        // 並傳遞最小化參數
        if (ret == IDNO)   
        {
            uMsg      = WM_SYSCOMMAND;
            wParam    = SC_MINIMIZE;
            lParam    = NULL;
        }        
    }

    // 其它的消息還是走原來的窗口處理過程,不耽誤Outlook自身的運行
    return CallWindowProc((WNDPROC)oldWndProc , hWnd, uMsg, wParam, lParam);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章