Outlook关闭时最小化插件的实现

Windows下使用Outlook,点击右上角的关闭按钮时,程序在没有任何提示的情况下直接退出,也没有设置提醒之类的功能,使用体验差,误“杀”的几率较高,而在Mac环境下同样的操作并不会使得程序退出,完全无法领会Outlook产品经理的设计理念。

之前使用的是Outlook2010,本以为Outlook的最新版本会解决这个问题,没想到安装Outlook2016后还是这样的尿性。因此搜了下有没有这样的现成的工具,结果还真有,现罗列如下,如有需要可以下载体验

  • https://sourceforge.net/projects/keepoutlook/,这个工具的功能是将用户的关闭按钮的点击动作转换为最小化按钮的动作,实现了关闭时最小化这个功能。但有一个问题,就是使用它之后导致没办法通过正常途径关闭Outlook程序了,如果要关,只能任务管理器杀进程了。
  • http://www.reliefjet.com/Quicks/Features/QuickTweaks,这个工具功能貌似挺多,但我没有使用,因为我就只是想要一个关闭时最小化的工具而已,何必给我个那么复杂的。

既然没有一个称心如意的,那只有自己动手实现一个了,其实就是写一个Outlook的插件而已。功能就是当你点击右上角的关闭按钮时,温馨提示下你要不要关闭,如果确实要关闭,就真的关闭;如果是误点击,则点击否即可。实现效果如右图所示。

思路比较简单,分为两步:

第一,在插件的OnConnection函数中获取当前Outlook的窗口句柄

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);
}

大概思路就是这样的,现给出编译好的文件如下所示,可以直接下载使用。

点击下载OutlookExtDll

使用说明:把OutlookExt.dll放在任意目录,最好放在一个固定的不随意删除的目录,比如 C:\Program Files (x86)\Microsoft Office 等

安装:使用 regsvr32 /s OutlookExt.dll 命令注册下,重启Outlook,功能生效
卸载:使用 regsvr32 /u OutlookExt.dll 命令反注册,重启Outlook,功能失效

注意:如果Outlook程序是64位的,要使用 OutlookExt_x64.dll 文件,上述命令要替换成这个文件名

上述两个文件一个是32位Outlook程序使用的,一个是64位Outlook程序使用的,请先查明自己所使用的是32位的还是64位的。注意这里的32位/64位指的不是操作系统位数,而是Outlook软件的位数,请注意区分。

源码下载地址:https://files.cnblogs.com/files/Jocent/OutlookExt-Solution.zip

 

还有,Outlook的最小化时隐藏选项可以实现最小化后任务栏不显示Outlook程序,对于强迫症是一个福音。

 

 

 




12 Comments

  • haipzm AT gmail.com
    希望分享一下源码,一方面是学习,一方面是保证内容没问题,不敢随便用,谢谢!

  • 博主思路很不错,这个问题困扰了我很久,也用过一些插件,不怎么好用。希望分享一下源码,我研究研究,谢谢!
    email:[email protected]

  • 博主V5,这之前也用过一些插件,不怎么好用。希望分享一下源码,学习一下,谢谢!

  • 其实我想要的,就是把Outlook改成和大多数软件一样,可以设置为点击最小化按钮最小化到任务栏,点击关闭按钮隐藏到托盘。
    是过几个插件,基本解决方案都是把关闭按钮的功能直接改成了最小化,防止误操作导致Outlook退出。博主的这个插件,已经比他们人性化了,而且关键是简洁不冗余。但是,Outlook到任务栏还是到托盘,还是二选一。
    个人有个想法:点击最小化,则自动取消勾选“最小化时隐藏”,让软件最小化到任务栏;点击关闭,则自动勾选“最小化时隐藏”,让软件隐藏到托盘。后者可以设置为一个可选项,即从默认和修改的两种方案中选一种。
    可是我不会编程……

  • 个人有个想法:点击最小化,则自动取消勾选“最小化时隐藏”,让软件最小化到任务栏;点击关闭,则自动勾选“最小化时隐藏”,让软件隐藏到托盘。后者可以设置为一个可选项,即从默认和修改的两种方案中选一种。

    不会编写插件,表示只能做伸手党了……

  • 用了一下没有生效,卸载也失败了,卸载时报错:
    模块“OutlookExt_x64.dll”已加载,但对 DllUnregisterServer 的调用失败,错误代码为 0x8002801c。
    Outlook版本是:16.0.8201.2213 64位

  • Comments are closed.