Контекстное меню исчезает с Word автоматизации - PullRequest
16 голосов
/ 01 июня 2010

Когда я редактирую документ Word в OleContainer (на месте) и переключаюсь на другой документ Word, а затем переключаюсь обратно, я больше не могу использовать кнопку правой кнопки мыши. Контекстное меню не будет отображаться.

Это происходит в Word 2000, а не в Word 2007 (я не знаю о других версиях).

Как мне избавиться от этого поведения?

Как воспроизвести:

  • Создание нового приложения VCL
  • Добавить строку меню
  • Добавление TOleContainer, Align alClient, AllowInPlace и AllowActiveDoc True.
  • С помощью TOleContainer вставьте документ Word 97-2003
  • Добавьте пункт меню «Закрыть» в строку меню, в обработчике событий добавьте OleContainer1.DestroyObject, чтобы вы могли прекратить редактирование
  • Запустите это приложение, дважды щелкните на OleContainer, чтобы оно перешло в режим редактирования
  • Теперь откройте Word 2000
  • Переключитесь обратно на ваше приложение, контекстное меню больше не будет работать.

Edit: Я воспроизвел вышеупомянутое поведение на следующей системе (используя Citrix):

Windows Server 2003 Enterprise Edition
Версия 5.2 (сборка 3790.srv03_sp2_rtm.070216-1710: пакет обновления 2)

Microsoft Word 2000 (9.0.6926 SP-3)

Я использовал Delphi 7 (сборка 8.1) для создания приложения.

Ответы [ 3 ]

4 голосов
/ 26 ноября 2010

При размещении приложений Office через ActiveX вы обнаружите, что некоторые версии некоторых приложений Office смехотворно обидчивы, когда их информируют об изменениях активации окна, и это может особенно повлиять на их контекстные меню.

В основном, если вы не скажете им, когда они теряют или получают фокус, а также всякий раз, когда ваше окно верхнего уровня получает или теряет фокус (даже если их дочерний элемент управления в окне не получает фокус), тогда они могут сойти с ума.

Это то, с чем я долго боролся, и особенно расстраивает, когда приходится рассказывать приложениям, что они в лучшем положении, чем вы (например, когда они теряют или получают фокус непосредственно ...) или когда они создают всплывающее меню, которое отвлекает внимание от них и должно обрабатываться иначе, чем какое-либо другое приложение / окно с фокусом, которое вам остается предугадать ... Тьфу.

В любом случае приложения Office должны предоставлять интерфейс IOleInPlaceActiveObject, и вы должны убедиться, что вы вызываете его метод OnFrameWindowActivate, чтобы сообщить ему об активации / деактивации.

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

Извините, что я не могу дать больше советов, чем просто указывать в этом направлении ... Написание хостов ActiveX - это черное искусство (вся документация направлена ​​на размещение, а не на хост :() и единственный способ, которым я получил свой собственный код работал через месяцы проб и ошибок и чертовски много отладок. К сожалению, это кошмар.

Последний совет: не бойтесь жестко кодировать ключи для конкретных приложений. Это то, что делает сам IE, с настройками реестра, чтобы контролировать, какие кладжи применяются к чему (и я подозреваю, что некоторые более жестко запрограммированы в коде) ActiveX является настолько плохо определенным беспорядком, что различные элементы управления имеют свои собственные причуды и ошибки, и невозможно написать чистый, общий хост, который работает со всеми из них. (Изменение, исправляющее одно, сломает другое.) Вы также найдете вещи, которые работают, только если вы попробуете интерфейсы в том же порядке, что и IE, только потому, что они были протестированы только с IE; сделать вещи немного по-другому, и они разваливаются. (

0 голосов
/ 16 февраля 2011

Может быть, вы можете использовать компонент для вызова приложения. У меня никогда не возникало проблем с созданием собственного компоновки для вызова слова через интерфейсы и последующей регистрации специальных команд в меню. В контейнере нельзя ли оформить специальное меню на форме? Есть несколько WordSink Evenets, которые помогут в сохранении и закрытии, которые можно использовать вместе с объектами word com.

0 голосов
/ 12 ноября 2010

Интересно, можно ли перехватить какое-либо событие типа Lost Focus из формы, содержащей контейнер OLE, когда вы можете уничтожить документ в контейнере OLE, но сохранить его в памяти. Затем в любом событии типа Got Focus для формы вы можете проверить, есть ли у вас этот документ; если это так, перезагрузите его в контейнер OLE.

Будет ли это работать для вас?

...