Средства разработки приложений


Перехват событий Excel


Перехватывая события Excel, Вы получаете возможность отслеживать его состояние и контролировать некоторые действия. Например, Вы можете отследить закрытие рабочей книги и корректно отключиться от Excel, произведя очистку памяти и прочие завершающие процедуры. Для того, чтобы понять, как перехватывать события, проведем небольшой экскурс в события COM объектов. В этом отступлении я предполагаю, что читатель немного знаком с COM архитектурой, хотя это не обязательно, в конце статьи я приведу уже готовое решение, которое можно использовать в своих приложениях, даже не задумываясь о тонкостях COM.

Если объект (будь-то СОМ или RCW объекта .NET) хочет получать события другого COM объекта, то он должен уведомить об этом источник событий, зарегистрировав себя в списке объектов-получателей уведомлений о событиях. Для этого СОМ предоставляет интерфейс IConnectionPointContainer, содержащий метод FindConnectionPoint. С помощью вызова метода FindConnectionPoint, объект-получатель события получает "точку подключения" - интерфейс IConnectionPoint и регистрирует c помощью метода Advise свою реализацию интерфейса IDispatch, методы которого будут реализовываться при возникновении тех или иных событий. Excel определяет интерфейс, который должен реализовываться классом-приемником событий.

interface
["00024413-0000-0000-C000-000000000046"]
{
DispId(0x61d)]
void NewWorkbook(object Wb);

DispId(0x616)]
void SheetSelectionChange(object Sh, object Target);

DispId(0x617)]
void SheetBeforeDoubleClick(object Sh, object Target, ref bool Cancel);

DispId(1560)]
void SheetBeforeRightClick(object Sh, object Target, ref bool Cancel);

DispId(0x619)]
void SheetActivate(object Sh);

DispId(0x61a)]
void SheetDeactivate(object Sh);

DispId(0x61b)]
void SheetCalculate(object Sh);

DispId(0x61c)]
void SheetChange(object Sh, object Target);

DispId(0x61f)]
void WorkbookOpen(object Wb);

DispId(0x620)]
void WorkbookActivate(object Wb);

DispId(0x621)]
void WorkbookDeactivate(object Wb);

DispId(1570)]



Начало  Назад  Вперед