本机窗口:关闭时释放句柄
本文关键字:释放 句柄 窗口 本机 | 更新日期: 2023-09-27 18:07:17
我目前正在为Microsoft Outlook开发一个c# . net插件。该插件的目标是捕获来自Outlook即时搜索的搜索输入,并在自定义窗格中显示我自己的搜索结果。
它工作得很好,并且用原生窗口子类化Outlook窗口,我得到搜索字符串,它已经传递到我的面板。
问题是现在,当你关闭加载项(通过"File->Options->Add-Ins->COM Add-Ins",但不是与窗格中的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时出现。
此外,主Add-In源文件中的事件(如AppDomain.CurrentDomain.ProcessExit
、this.Shutdown
或((Outlook.ApplicationEvents_10_Event)this.Application).Quit
)不会被调用。
当插件终止时,我可以监听(可靠地)被触发的哪个事件?有吗?如果没有,我有什么替代方案来解决我的问题?
解决:由于汉斯进行中
当通过COM加载项对话框手动断开加载项时,似乎真的触发了ThisAddIn_Shutdown
事件。
我认为在托管代码中可以做的事情不多。未受管理的代码本来可以工作得很好;COM系统会礼貌地询问您是否可以通过调用您的DllCanUnload
实现来卸载您的dll。
确保在您的插件注册表中添加DWORD RequireShutdownNotification=1,否则ThisAddIn_Shutdown()将不会被调用