本机 Window:关闭时释放句柄
Native Window: Release Handle On Close
我目前正在开发 Microsoft Outlook 的 C# .NET 插件。
该加载项的目标是从 Outlook 即时搜索中捕获搜索输入,并在自定义窗格中显示我自己的搜索结果。
它工作得很好,并且通过使用本机 Window 对 Outlook Window 进行子类化,我得到了搜索字符串,它已经将其传递到我的面板中。
现在的问题是,当您关闭加载项时(通过“文件->选项->加载项->COM 加载项”,但是not with the X in the pane), 加载项立即终止,我无法事先调用 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;
}
}
我已经尝试收听一些 Window 加载项关闭时应调用的消息,但这些消息仅在我以正常方式关闭 Outlook 时出现。
此外,不会调用主加载项源文件中的事件,如 AppDomain.CurrentDomain.ProcessExit
、this.Shutdown
或 ((Outlook.ApplicationEvents_10_Event)this.Application).Quit
。
加载项终止时,我可以(可靠地)监听什么事件被触发?有一些吗?如果没有,我有什么替代方案可以解决我的问题?
我认为您在托管代码中无能为力。未经处理的代码可以正常工作; COM 系统会礼貌地询问您是否可以通过调用 DllCanUnload
.
的实现来卸载您的 dll
已解决:感谢Hans Passant
当通过 COM 加载项对话框手动断开加载项时,似乎确实触发了 ThisAddIn_Shutdown
事件。
确保在插件注册表中添加 DWORD RequireShutdownNotification=1,否则 ThisAddIn_Shutdown() 将不会被调用
我目前正在开发 Microsoft Outlook 的 C# .NET 插件。 该加载项的目标是从 Outlook 即时搜索中捕获搜索输入,并在自定义窗格中显示我自己的搜索结果。
它工作得很好,并且通过使用本机 Window 对 Outlook Window 进行子类化,我得到了搜索字符串,它已经将其传递到我的面板中。
现在的问题是,当您关闭加载项时(通过“文件->选项->加载项->COM 加载项”,但是not with the X in the pane), 加载项立即终止,我无法事先调用 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;
}
}
我已经尝试收听一些 Window 加载项关闭时应调用的消息,但这些消息仅在我以正常方式关闭 Outlook 时出现。
此外,不会调用主加载项源文件中的事件,如 AppDomain.CurrentDomain.ProcessExit
、this.Shutdown
或 ((Outlook.ApplicationEvents_10_Event)this.Application).Quit
。
加载项终止时,我可以(可靠地)监听什么事件被触发?有一些吗?如果没有,我有什么替代方案可以解决我的问题?
我认为您在托管代码中无能为力。未经处理的代码可以正常工作; COM 系统会礼貌地询问您是否可以通过调用 DllCanUnload
.
已解决:感谢Hans Passant
当通过 COM 加载项对话框手动断开加载项时,似乎确实触发了 ThisAddIn_Shutdown
事件。
确保在插件注册表中添加 DWORD RequireShutdownNotification=1,否则 ThisAddIn_Shutdown() 将不会被调用