參考: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);
}