gpt4 book ai didi

c# - Excel VSTO 中的 Form.Show(IWin32Window) 方法在应用程序关闭时导致 ThreadAbortException

转载 作者:行者123 更新时间:2023-11-30 22:06:37 26 4
gpt4 key购买 nike

我有一个 excel 加载项,我有一个表格,我想在 excel 窗口前显示。为此,我在 excel 功能区菜单按钮上使用 NativeWindow,如下所示:

public partial class MyRibbonMenu
{
public List<Form> Forms = new List<Form>();

private void button1_Click(object sender, RibbonControlEventArgs e)
{
// initialize form
Form frm = new Form();
frm.Text = "Test Form";
Forms.Add(frm);

// create the native window handle
NativeWindow nw = new NativeWindow();
IntPtr iptr = new IntPtr(Globals.ThisAddIn.Application.Hwnd);
nw.AssignHandle(iptr);

// when close the form release the handle
frm.FormClosed += (sender2, e2) =>
{
Forms.Remove(frm);
nw.ReleaseHandle();
};

// show with owner
frm.Show(nw);
}

}

如果我在退出 excel 之前关闭表单,一切正常,这非常有效。但是,如果用户想在不关闭打开的表单的情况下退出 excel,则会发生 ThreadAbortException 异常:

System.Windows.Forms.dll 中出现“System.Threading.ThreadAbortException”类型的未处理异常

附加信息:线程被中止。

为了解决这个问题,我尝试了以下代码但没有成功:

private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
var frms = Globals.Ribbons.MyRibbonMenu.Forms.ToArray();
foreach (var frm in frms)
{
frm.Close();
}
}

哪里会出错?

最佳答案

我使用 IWin32Window 接口(interface)代替 NativeWindow 解决了这个问题:

public class Win32Window : System.Windows.Forms.IWin32Window
{
public Win32Window(int windowHandle)
{
_windowHandle = new IntPtr(windowHandle);
}

IntPtr _windowHandle;

public IntPtr Handle
{
get { return _windowHandle; }
}
}

在此之后,我更改了下面的表单初始化代码:

private void button1_Click(object sender, RibbonControlEventArgs e)
{
// initialize form
var frm = new Form();
frm.FormBorderStyle = FormBorderStyle.FixedSingle;
frm.MinimizeBox = false;
frm.MaximizeBox = false;
frm.Text = "Test Form";
frm.StartPosition = FormStartPosition.CenterScreen;
Forms.Add(frm);

// create the native window handle
var nw = new Win32Window(Globals.ThisAddIn.Application.Hwnd);

// show with owner
frm.Show(nw);
}

关于c# - Excel VSTO 中的 Form.Show(IWin32Window) 方法在应用程序关闭时导致 ThreadAbortException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23519382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com