Outlook 2010加载项,如何取消关闭事件,最小化窗口? (C#)

时间:2012-03-05 20:18:52

标签: c# outlook-2010

经过几个小时的实验和谷歌搜索后,我终于看到了我自己能想到的结果,所以这就是我现在所拥有的:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    Application.Startup += new
        Outlook.ApplicationEvents_11_StartupEventHandler(
        ApplicationObject_Startup);
    ((Outlook.ApplicationEvents_11_Event)Application).Quit += new
        Outlook.ApplicationEvents_11_QuitEventHandler(
        ApplicationObject_Quit);
}
void ApplicationObject_Startup()
{
    MessageBox.Show("Startup Event");
    ((Outlook.ExplorerEvents_10_Event)Application.ActiveExplorer()).Close += new
        Outlook.ExplorerEvents_10_CloseEventHandler(
        ExplorerObject_Close);
}

void ApplicationObject_Quit()
{
    MessageBox.Show("Quit Event");
}

void ExplorerObject_Close()
{
    MessageBox.Show("Explorer Close Event");
}

所有这些都有效,当我关闭Outlook时,我会看到探测器关闭事件并按顺序退出事件消息框。但是到目前为止,outlook似乎已经关闭了,我不知道如何取消这些事件(对于其他一些事件,有一个bool取消传递,你可以设置为false,但不能用于这些事件?),或发送最小化事件(我根本无法解决这个问题)。

如果有人有任何建议我真的很感激。我有一些业余时间在工作,并想我会尝试学习一些插件开发的东西,同时解决一个非常恼人的部分前景!

编辑:我也尝试过:

Application.ActiveExplorer().WindowState = Outlook.OlWindowState.olMinimized;

在启动时立即最小化窗口。它确实最小化了前景,但没有放到系统托盘上,只放到栏上(这很有趣,可能实际上是一个错误,因为最小化设置为最小化到托盘......)仍然,如果我可以摆脱关闭/ quit event(s)我至少可以将窗口最小化到任务栏。

1 个答案:

答案 0 :(得分:2)

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        try
        {
            // Assign startup and quit events
            Application.Startup += new Outlook.ApplicationEvents_11_StartupEventHandler(ApplicationObject_Startup);
            ((Outlook.ApplicationEvents_11_Event)Application).Quit += new Outlook.ApplicationEvents_11_QuitEventHandler(ApplicationObject_Quit);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "EXCEPTION", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        try
        {
            // Remove the startup and quit events
            Application.Startup -= new Outlook.ApplicationEvents_11_StartupEventHandler(ApplicationObject_Startup);
            ((Outlook.ApplicationEvents_11_Event)Application).Quit -= new Outlook.ApplicationEvents_11_QuitEventHandler(ApplicationObject_Quit);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "EXCEPTION", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    void ApplicationObject_Startup()
    {
        try
        {
            // Minimize to taskbar
            Application.ActiveExplorer().WindowState = Outlook.OlWindowState.olMinimized;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "EXCEPTION", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    void ApplicationObject_Quit()
    {
        try
        {
            // Restart outlook minimized
            ProcessStartInfo psiOutlook = new ProcessStartInfo("OUTLOOK.EXE", "/recycle");
            psiOutlook.WindowStyle = ProcessWindowStyle.Minimized;
            Process.Start(psiOutlook);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "EXCEPTION", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

它不是很干净,但这对我有用。它只是在您关闭它时启动一个新的Outlook实例,并始终在启动时最小化Outlook。当然主要的缺点是,如果没有先在任务管理器中禁用加载项或终止“outlook.exe”,就无法真正关闭Outlook。不是最好的解决方案,但它确实会确保您永远不会错过电子邮件或日历提醒,因为您意外关闭了Outlook。

编辑(10/02/12):我更新了代码的重启前景部分。它现在使用/ recycle开关启动outlook.exe。这会尝试在现有窗口中重新加载Outlook。它还使用最小化的窗口样式重新启动outlook。这可以防止Outlook的加载窗口出现。