我目前正在为Microsoft Outlook开发C#.NET加载项。加载项的目标是从Outlook即时搜索中捕获搜索输入,并在自定义窗格中显示我自己的搜索结果。
它运行得很好,并且通过使用本机窗口将Outlook窗口子类化,我得到了搜索字符串,它已经将它传递到我的面板中。
现在的问题是,当您关闭加载项时(通过“文件 - >选项 - >加载项 - > COM加载项”,而不是窗格中的X),加载项立即终止我不能事先打电话给searchboxWindow.ReleaseHandle()
来恢复我的WndProc链。 Outlook只是崩溃而没有任何明显的错误。
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch ((uint)m.Msg)
{
case WindowMessages.WM_DESTROY:
case WindowMessages.WM_QUIT:
case WindowMessages.WM_NCDESTROY:
this.ReleaseHandle();
return;
case WindowMessages.WM_KEYUP:
case WindowMessages.WM_LBUTTONDOWN:
case WindowMessages.WM_RBUTTONDOWN:
OnKeyUp();
break;
case WindowMessages.WM_EXITSIZEMOVE:
OnResize();
break;
}
}
我已经尝试收听一些应该在加载项关闭时调用的窗口消息,但这些消息仅在我以正常方式关闭Outlook时出现。
此外,主要的加载项源文件(如AppDomain.CurrentDomain.ProcessExit
,this.Shutdown
或((Outlook.ApplicationEvents_10_Event)this.Application).Quit
)中的事件不会被调用。
当加载项终止时,我可以听到什么事件(可靠地)被触发?有一些吗?如果没有,我有什么替代方案来解决我的问题?
解决:感谢Hans Passant
看起来当通过COM加载项对话框手动断开加载项时,会触发ThisAddIn_Shutdown
事件。
我不认为您可以在托管代码中做很多事情。没有损坏的代码可以正常工作; COM系统会礼貌地问你是否可以通过调用DllCanUnload
的实现来卸载你的dll。
确保在addin注册表中添加DWORD RequireShutdownNotification = 1,否则不会调用ThisAddIn_Shutdown()