原生窗口:关闭时释放句柄

时间:2015-08-11 15:16:54

标签: c# outlook outlook-addin wndproc nativewindow

我目前正在开发一个用于Microsoft Outlook的 C#.NET加载项。 加载项的目标是从Outlook Instant Search捕获搜索输入,并在自定义窗格中显示我自己的搜索结果。

它工作得很好,并且通过使用本机窗口将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.ProcessExitthis.Shutdown((Outlook.ApplicationEvents_10_Event)this.Application).Quit中的事件不会被调用。

当加载项终止时,我可以听到什么事件(可靠地)被触发?有一些吗?如果没有,我有什么替代方案来解决我的问题?

3 个答案:

答案 0 :(得分:1)

已解决:感谢 Hans Passant

看起来当通过COM加载项对话框手动断开加载项时,会触发ThisAddIn_Shutdown事件。

答案 1 :(得分:0)

我认为您无法在托管代码中执行任何操作。没有损坏的代码可以正常工作; COM系统会通过调用DllCanUnload的实现来礼貌地询问您是否可以卸载您的dll。

答案 2 :(得分:0)

确保在加载项注册表中添加DWORD RequireShutdownNotification = 1,否则将不会调用ThisAddIn_Shutdown()