Подклассирование окна MS Word из надстройки VSTO - PullRequest
0 голосов
/ 14 октября 2011

Я пытаюсь обнаружить некоторые события, которые VSTO не предоставляет, такие как WM_MOVE, WM_SIZE и т. Д., Чтобы отрегулировать положение окна.Это окно создано надстройкой, над которой я работаю, и должно реагировать при изменении окна Word.Мне в основном удается выполнить мою задачу, но остается очень неприятная проблема.Всякий раз, когда я закрываю Word, он вызывает свой обработчик сбоя.Очевидно, это связано с неправильным удалением объекта, основанного на NativeWindow, который я использую.Я поместил кнопку на ленте, чтобы иметь возможность располагать объект вручную, и он работал отлично.Я подозреваю, что сборщик мусора по какой-то причине не выполняет свою работу должным образом.Кроме того, даже вызов ReleaseHandle () для WM_CLOSE или WM_DESTROY не предотвращает сбой.Вот код моего объекта-перехватчика:

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.

...