Предотвратить дочерний процесс от создания видимых окон? - PullRequest
5 голосов
/ 24 февраля 2011

Я пытаюсь использовать Office Automation (PIA) для преобразования некоторых .pptx документов в некоторые другие форматы.Тем не менее, PowerPoint настаивает на отображении индикатора выполнения, даже если главное окно скрыто.

Можно ли как-нибудь запретить PowerPoint отображать Windows на главном рабочем столе?

Дополнительная информация:

В основном я использую C #, COM PIA для взаимодействия с Office.Но я не боюсь копаться в C ++: P

Я запускаю PowerPoint, используя PIA вот так

var app = new PowerPoint.Application();
var ppt = app.Presentations.Open("my.pptx");

// This line will show a progress dialog
ppt.SaveAs("out.pdf",
    PowerPoint.PpSaveAsFileType.ppSaveAsPDF,
    MsoTriState.msoTrue);

app.Quit();

Ответы [ 2 ]

3 голосов
/ 24 февраля 2011

Вы можете использовать вызов CreateDesktop для создания альтернативного рабочего стола перед вызовом процесса powerpoint. Это гарантирует, что окна, созданные powerpoint, не будут видны. Однако здесь есть ряд предостережений:

  • Вам нужно будет сделать это в альтернативной ветке; Вы не хотите менять рабочий стол в основном потоке графического интерфейса пользователя
  • Вероятно, лучше всего инициализировать powerpoint один раз в отдельном потоке с альтернативным рабочим столом и сохранять его в том же потоке до тех пор, пока вы не прекратите работу. Это гарантирует, что вызов не будет вызван вызовом с нескольких рабочих столов.
  • Если в Powerpoint появится какое-либо диалоговое окно, пользователь не сможет ответить на него, если вы не переключите их на альтернативный рабочий стол для взаимодействия с PowerPoint.
  • Если powerpoint является сервером вне процесса, могут произойти плохие вещи (powerpoint загружается на альтернативный рабочий стол, затем пользователь пытается открыть powerpoint вручную, после чего основной пользовательский интерфейс powerpoint загружается на невидимый альтернативный рабочий стол). Это, вероятно, то, что вам нужно тщательно проверить. Эту проблему можно избежать, если также создать альтернативную оконную станцию ​​, но, поскольку оконные станции являются глобальными для процессов, вам потребуется порождать вспомогательный дочерний процесс, чтобы в этом случае взаимодействовать с powerpoint.

Вы также можете попробовать использовать Windows Message Hook , чтобы определить, когда окно создано, и сохранить его невидимым. Это также имеет ряд предостережений:

  • Вам нужно будет найти надежный способ определения интересующего вас окна (имя класса окна?)
  • Если powerpoint является сервером вне процесса, будет окно, в котором активна ваша ловушка, и он может скрыть неправильный диалог прогресса (т. Е. Принадлежащий другому процессу). Чтобы минимизировать этот шанс, проверьте, находится ли powerpoint в процессе (в этом случае запрограммируйте перехватчик, чтобы он влиял только на ваш собственный процесс), и если нет, организуйте перехват, чтобы он был активен только в течение минимального периода времени, необходимого для подавления окно прогресса.
  • Будущие релизы PowerPoint могут сломать любой метод, который вы используете, чтобы идентифицировать интересующее вас окно. С этим мало что можно сделать.
1 голос
/ 28 ноября 2018

Вы можете попытаться оставить свойство Application.Visible со значением по умолчанию и передать MsoTriState.msoFalse в WithWindow параметр при открытии презентации:

var application = new Application();
var document = application.Presentations.Open(fileName, MsoTriState.msoFalse, MsoTriState.msoFalse, 
    WithWindow: MsoTriState.msoFalse);

Если вы явно установите для свойства Application.Visible значение MsoTriState.msoFalse, вы получите ошибку «Скрытие окна приложения запрещено».

...