我正在尝试检测VSTO没有提供的一些事件,例如WM_MOVE,WM_SIZE等,以便调整窗口的位置。此窗口由我正在处理的加载项创建,并应在Word窗口更改时作出反应。我基本上设法完成了我的任务,但仍然存在一个非常烦人的问题。每当我关闭Word时,它都会弹出崩溃处理程序。显然,这与我使用的基于NativeWindow的对象的不当处置有关。我在功能区中放了一个按钮,可以用手处理物体,它工作得很好。我怀疑垃圾收集器由于某种原因没有正常工作。此外,即使在WM_CLOSE或WM_DESTROY上调用ReleaseHandle()也不能防止崩溃。这是我的拦截器对象的代码:
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。