替换窗口消息处理过程
         
                原创
        
    
    
                
             ©著作权归作者所有:来自51CTO博客作者friendan的原创作品,请联系作者获取转载授权,否则将追究法律责任        
            
                    
                
参考:https://jocent.me/2017/06/20/outlook-close-minimize.html
HWND hWndOutlook = FindWindowEx(NULL, NULL, TEXT("rctrl_renwnd32"), NULL);
使用GetWindowLongPtr和SetWindowLongPtr对窗口的处理过程进行一个重定向,
在重定向的窗口过程里截获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);
}