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