从VSTO加载项对MS Word的窗口进行子类化

时间:2011-10-14 10:46:37

标签: c# crash ms-word vsto subclassing

我正在尝试检测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。

0 个答案:

没有答案