Как сохранить взаимодействие Excel от кражи фокуса при вставке изображений - PullRequest
2 голосов
/ 25 апреля 2009

Я использую взаимодействие Excel COM для вставки изображений (в частности, EPS) в электронную таблицу. Изображения вставляются нормально, но Excel игнорирует все видимые / фоновые настройки и фокусирует на дисплее диалоговое окно с надписью «импорт изображения». Диалоговое окно остается только частью раздела, но оно заставляет экран мерцать, и что еще хуже, когда я вставляю много изображений одновременно, он может монополизировать систему на несколько секунд (включая кражу нажатий клавиш из процесса переднего плана). 1001 *

Я устанавливаю параметры фона следующим образом:

Excel.Application xlApp = new Excel.Application();
xlApp.Visible = false;
xlApp.ScreenUpdating = false;
xlApp.DisplayAlerts = false;
Excel.Worksheet worksheet;
//....
worksheet.Pictures(Type.Missing).Insert(filename,Type.Missing); //steals focus

Как сделать так, чтобы Excel оставался здесь в фоновом режиме, как будто он принадлежит?

Ответы [ 3 ]

3 голосов
/ 01 мая 2009

Я подозреваю, что это вызвано компонентом, который Microsoft лицензировал, который ведет себя плохо.

Единственный способ справиться с подобными ситуациями - перехватить соответствующее низкоуровневое сообщение Windows и заблокировать его с помощью Win32 hook

Самый простой способ сделать это, и, поверьте мне, это не красиво, это использовать крючок CBT. CBT расшифровывается как «Компьютерное обучение». Это древняя и почти устаревшая технология, предназначенная для создания учебных приложений, которые следят за тем, что вы делаете, и реагируют соответствующим образом. Единственное, для чего это нужно - это перехватывать и предотвращать активацию окна в коде, к которому у вас нет доступа. Вы можете перехватить код HCBT_ACTIVATE и предотвратить активацию окна.

Это, вероятно, должно быть сделано в C или C ++.

1 голос
/ 11 июля 2015

Вопреки здравому смыслу, установка xlApp.ScreenUpdating = true; предотвращает кражу фокуса! ( источник )

0 голосов
/ 28 апреля 2009

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

xlApp.EnableEvents = False

Очевидно, что вы должны быть чувствительны к этому параметру, когда полагаетесь на события Excel в своем коде, но на случай, если при вставке возникают нежелательные события, это может помочь.

Удачи!

...