Сбой при сохранении ручки Excel
При запуске своей надстройки Excel я сохраняю дескриптор окна Excel, используя следующий код:
ExcelWindow = new NativeWindow();
ExcelWindow.AssignHandle(new IntPtr(Application.Hwnd));
Когда дело доходит до освобождения ручки, я пытаюсь сделать это при выключении:
private void ThisAddInShutdown(object sender, EventArgs e)
{
try
{
ExcelWindow.ReleaseHandle();
}
catch
{
}
}
При выходе из Excel в режиме отладки все работает нормально. К сожалению, когда я запускаю этот код в производственной системе, у меня происходит сбой, и я не могу отлаживать происходящее. Я получаю окно "Окно проверяет эту проблему", впоследствии оно исчезает, и все.
Это действительно не имеет большого значения, но я не хочу раздражать пользователей чем-то вроде этого. Итак, кто-нибудь знает, что это может быть и как я могу это отладить? Благодарю.
1 ответ
Решение
Мое решение:
public partial class ThisAddIn
{
ExcelWindow window;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
window = new ExcelWindow();
Application.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(Application_WorkbookBeforeClose);
Application.WorkbookActivate += new Excel.AppEvents_WorkbookActivateEventHandler(Application_WorkbookActivate);
Application.WorkbookDeactivate += new Excel.AppEvents_WorkbookDeactivateEventHandler(Application_WorkbookDeactivate);
}
void Application_WorkbookDeactivate(Excel.Workbook Wb)
{
window.ReleaseHandle();
}
void Application_WorkbookActivate(Excel.Workbook Wb)
{
window.AssignHandle(new IntPtr(Application.Hwnd));
}
void Application_WorkbookBeforeClose(Excel.Workbook Wb, ref bool Cancel)
{
if (Application.Workbooks.Count > 1 || window.Handle == IntPtr.Zero) return;
Cancel = true;
window.ReleaseHandle();
Dispatcher.CurrentDispatcher.BeginInvoke(new MethodInvoker(Application.Quit), null);
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}