Перечисление дескрипторов окон (созданных из службы) в службе для определения их подписей - PullRequest
1 голос
/ 18 июля 2011

У меня есть служба, которая должна запускать приложение (назовем его X), которое в сети использует автоматизацию Excel.

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

Я просто хотел бы иметь возможность закрыть это диалоговое окно в Excel.

Это, конечно,легко сделать, когда код не работает как сервис.Проблема состоит в том, что любой вызов окна win32 возвращает 0 для дескриптора при перечислении окон, чтобы определить, запущен ли диалог.Я понимаю, почему это так, поскольку служба работает изолированно и ожидается результат 0.

Также невозможно, чтобы служба работала в локальной системе с включенным интерактивным рабочим столом.

Я надеялсячтобы использовать GetThreadDesktop в потоке для процесса Excel, затем откройте этот рабочий стол, чтобы перечислить эти окна, однако при запуске из службы api также возвращает 0.

Существует множество вопросов по этому поводу, однако большинство из нихо желании отобразить диалог из службы для взаимодействия с пользователем.Я не хочу этого делать.Просто найдите и закройте диалоговое окно.

Есть ли хитрый обходной путь, который кто-то обнаружил для перечисления окон и возврата подписей?

Примечания:

  • ПриложениеX вне моего контроля.
  • Я знаю, что автоматизация делопроизводства не поддерживается в неинтерактивной среде.
  • В любом случае я не пытаюсь взаимодействовать с рабочим столом вошедшего в систему пользователя.

Ответы [ 2 ]

0 голосов
/ 18 июля 2011

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

0 голосов
/ 18 июля 2011

Я могу вспомнить несколько обходных путей - ни один из которых я никогда не пробовал, и я не могу точно сказать, действительно ли они работают или нет ...

  1. Создайте свой собственный рабочий стол из сервиса. Запустите приложение X, используя CreateProcess, и сделайте так, чтобы оно использовало только что созданный рабочий стол. Вы можете найти это обсуждение полезным.
  2. Создайте небольшой исполняемый файл, который позаботится о диалоге. Создайте задачу (в планировщике задач), которая будет запускать исполняемый файл. Пусть задача сохранит учетные данные, используемые Excel при запуске, чтобы он мог получить доступ к этому рабочему столу. Затем служба должна запустить задачу через API планировщика задач . Запустите этот путь, маленький исполняемый файл будет выполняться не в контексте системы, а в контексте определенного пользователя.
  3. Установите поток или общесистемный хук , который позволит вам работать в процессе Excel. Оттуда вы будете знать, что делать. Я сомневаюсь, что это сработает в вашем сценарии, и это будет незначительно взломать, но вы можете попробовать.
  4. Это уродливо, но может сработать: создайте небольшой исполняемый файл, который будет работать как обычный exe-файл, на «реальном» рабочем столе. Пусть этот исполняемый файл взаимодействует с X - оба находятся на одном рабочем столе, с этим проблем не должно быть. Сложная часть для вашего сервиса взаимодействовать с исполняемым файлом. Это может быть сделано с очень примитивными средствами, такими как файлы или сокеты. Например, имейте возможность наблюдать определенную папку и передавать команды и информацию в файлах. Это явно не надежно и не элегантно, но в некоторых случаях может быть достаточно.

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

О, и я чувствую к вам необходимость иметь дело с автоматизацией Office ... Потратил слишком много дней, пытаясь решить странные проблемы, связанные с автоматизацией Word.

...