本机窗口:关闭时释放句柄

本文关键字:释放 句柄 窗口 本机 | 更新日期: 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.ProcessExitthis.Shutdown((Outlook.ApplicationEvents_10_Event)this.Application).Quit)不会被调用。

当插件终止时,我可以监听(可靠地)被触发的哪个事件?有吗?如果没有,我有什么替代方案来解决我的问题?

本机窗口:关闭时释放句柄

解决:由于汉斯进行中

当通过COM加载项对话框手动断开加载项时,似乎真的触发了ThisAddIn_Shutdown事件。

我认为在托管代码中可以做的事情不多。未受管理的代码本来可以工作得很好;COM系统会礼貌地询问您是否可以通过调用您的DllCanUnload实现来卸载您的dll。

确保在您的插件注册表中添加DWORD RequireShutdownNotification=1,否则ThisAddIn_Shutdown()将不会被调用