При размещении приложений Office через ActiveX вы обнаружите, что некоторые версии некоторых приложений Office смехотворно обидчивы, когда их информируют об изменениях активации окна, и это может особенно повлиять на их контекстные меню.
В основном, если вы не скажете им, когда они теряют или получают фокус, а также всякий раз, когда ваше окно верхнего уровня получает или теряет фокус (даже если их дочерний элемент управления в окне не получает фокус), тогда они могут сойти с ума.
Это то, с чем я долго боролся, и особенно расстраивает, когда приходится рассказывать приложениям, что они в лучшем положении, чем вы (например, когда они теряют или получают фокус непосредственно ...) или когда они создают всплывающее меню, которое отвлекает внимание от них и должно обрабатываться иначе, чем какое-либо другое приложение / окно с фокусом, которое вам остается предугадать ... Тьфу.
В любом случае приложения Office должны предоставлять интерфейс IOleInPlaceActiveObject, и вы должны убедиться, что вы вызываете его метод OnFrameWindowActivate, чтобы сообщить ему об активации / деактивации.
Из памяти и быстрый просмотр моего собственного кода для размещения Office, это одна из самых важных вещей. Это также легко упустить из виду, думая: «Нет, это не имеет большого значения ... Почему что-то должно волновать, активно ли окно или нет?» Вы можете подумать, что это может привести только к некоторым незначительным косметическим проблемам (например, к активному появлению, когда это не так), но это может привести к зависанию или сбою всего этого. Поверьте мне, Office слишком заботится о таких вещах! У меня складывается впечатление, что под прикрытием Office все еще существует очень старый однопоточный дизайн со времен совместного многозадачности, и он может очень запутаться, когда два его окна кажутся активными одновременно.
Извините, что я не могу дать больше советов, чем просто указывать в этом направлении ... Написание хостов ActiveX - это черное искусство (вся документация направлена на размещение, а не на хост :() и единственный способ, которым я получил свой собственный код работал через месяцы проб и ошибок и чертовски много отладок. К сожалению, это кошмар.
Последний совет: не бойтесь жестко кодировать ключи для конкретных приложений. Это то, что делает сам IE, с настройками реестра, чтобы контролировать, какие кладжи применяются к чему (и я подозреваю, что некоторые более жестко запрограммированы в коде) ActiveX является настолько плохо определенным беспорядком, что различные элементы управления имеют свои собственные причуды и ошибки, и невозможно написать чистый, общий хост, который работает со всеми из них. (Изменение, исправляющее одно, сломает другое.) Вы также найдете вещи, которые работают, только если вы попробуете интерфейсы в том же порядке, что и IE, только потому, что они были протестированы только с IE; сделать вещи немного по-другому, и они разваливаются. (