经过几个小时的实验和谷歌搜索后,我终于看到了我自己能想到的结果,所以这就是我现在所拥有的:
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)我至少可以将窗口最小化到任务栏。
答案 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的加载窗口出现。