C# 子类化MS Word';将窗口从VSTO加载项中删除
我试图检测VSTO不提供的一些事件,例如WM_移动、WM_大小等,以便调整窗口的位置。此窗口是由我正在处理的外接程序创建的,当Word窗口发生更改时,它会做出反应。我基本上已经完成了我的任务,但仍然存在一个非常恼人的问题。每当我关闭Word时,它就会弹出它的崩溃处理程序。显然,这与我使用的基于NativeWindow的对象的不当处理有关。我在功能区中放置了一个按钮,可以手动处理对象,效果非常好。我怀疑垃圾收集器由于某种原因没有正常工作。此外,即使在WM_CLOSE或WM_DESTROY上调用ReleaseHandle(),也不能防止崩溃。以下是我的拦截器对象的代码:C# 子类化MS Word';将窗口从VSTO加载项中删除,c#,crash,ms-word,vsto,subclassing,C#,Crash,Ms Word,Vsto,Subclassing,我试图检测VSTO不提供的一些事件,例如WM_移动、WM_大小等,以便调整窗口的位置。此窗口是由我正在处理的外接程序创建的,当Word窗口发生更改时,它会做出反应。我基本上已经完成了我的任务,但仍然存在一个非常恼人的问题。每当我关闭Word时,它就会弹出它的崩溃处理程序。显然,这与我使用的基于NativeWindow的对象的不当处理有关。我在功能区中放置了一个按钮,可以手动处理对象,效果非常好。我怀疑垃圾收集器由于某种原因没有正常工作。此外,即使在WM_CLOSE或WM_DESTROY上调用Re
public class OfficeWindow : NativeWindow, IDisposable
{
public OfficeWindow(IntPtr handle)
{
this.AssignHandle(handle);
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case (int)WindowMessages.WM_MOVE:
MessageBox.Show("Move");
break;
//other cases
}
base.WndProc(ref m);
}
#region IDisposable Members
~OfficeWindow()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Free other state (managed objects).
}
ReleaseHandle();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
我使用的是VS 2008、VSTO 3.0和外接程序的目标是Word 2007。确保Dispose只发生一次。我看到你的析构函数会释放句柄,然后它会再次尝试这样做,当你真的做了处置(真的)。是的,很好的观点。我错过了。然而,它并没有解决我的问题。