簡體   English   中英

防止子進程創建可見窗口?

[英]Prevent child process from creating visible windows?

我正在嘗試使用Office Automation(PIA)將一些.pptx文檔轉換為其他格式。 但是,即使主窗口被隱藏,PowerPoint也會堅持顯示進度條。

有什么辦法可以阻止PowerPoint向主桌面顯示任何Windows嗎?

額外的信息:

我主要使用C#,COM PIA for Office interop。 但我並不害怕深入研究C ++:P

我像這樣使用PIA啟動PowerPoint

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();

您可以在調用powerpoint進程之前使用CreateDesktop調用來創建備用桌面。 這將確保powerpoint創建的窗口不可見。 但是,這里有一些警告:

  • 您需要在備用線程中執行此操作; 您不想更改主GUI線程上的桌面
  • 最好在具有備用桌面的專用線程上初始化powerpoint一次,並將其保留在同一個線程上,直到您終止為止。 這樣可以確保不會因為從多個桌面調用而混淆。
  • 如果powerpoint彈出任何類型的對話框,除非您將它們切換到備用桌面以與powerpoint交互,否則用戶將無法應答它。
  • 如果powerpoint是一個進程外服務器,可能會發生不好的事情(備用桌面上的powerpoint加載,然后用戶嘗試手動打開powerpoint,此時powerpoint的主UI加載在不可見的備用桌面上)。 這可能是您需要仔細測試的。 通過創建備用Window Station也可以避免此問題,但由於窗口站是進程全局的,因此在這種情況下,您需要生成輔助子進程來處理與powerpoint的交互。

您還可以嘗試使用Windows消息掛鈎來確定窗口何時創建並使其保持不可見。 這也有一些警告:

  • 你必須找到一種可靠的方法來識別感興趣的窗口(窗口類名?)
  • 如果powerpoint是進程外服務器,則會有一個窗口,您的掛鈎處於活動狀態,可能會隱藏錯誤的進度對話框(即屬於另一個進程的對話框)。 為了最大限度地減少這種可能性,請測試powerpoint是否在進行中(在這種情況下,將鈎子編程為僅影響您自己的進程),如果不是,則安排鈎子僅在抑制所需的最小時間內處於活動狀態進度窗口。
  • 未來的powerpoint版本可能會破壞您用於識別感興趣窗口的任何方法。 關於這一點你幾乎無能為力。

您可以嘗試將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 ,則會出現“不允許隱藏應用程序窗口”錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM