Я пытаюсь обнаружить некоторые события, которые 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.