防止子进程创建可见窗口?

时间:2011-02-24 14:22:32

标签: c# .net windows pinvoke

我正在尝试使用Office Automation(PIA)将一些.pptx文档转换为其他格式。但是,即使主窗口被隐藏,PowerPoint也会坚持显示进度条。

有什么方法可以阻止PowerPoint将任何Windows显示到主桌面?

额外信息:

我主要使用C#,COM PIA进行Office互操作。但我并不害怕深入研究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();

2 个答案:

答案 0 :(得分:3)

您可以在调用powerpoint进程之前使用CreateDesktop调用来创建备用桌面。这将确保powerpoint创建的窗口不可见。但是,这里有一些警告:

  • 您需要在备用线程中执行此操作;您不想更改主GUI线程上的桌面
  • 最好在具有备用桌面的专用线程上初始化powerpoint一次,并将其保留在同一个线程上,直到您终止为止。这样可确保不会因从多个桌面调用而混淆。
  • 如果powerpoint弹出任何类型的对话框,除非您将它们切换到备用桌面以与powerpoint交互,否则用户将无法应答它。
  • 如果powerpoint是一个进程外服务器,可能会发生不好的事情(备用桌面上的powerpoint加载,然后用户尝试手动打开powerpoint,此时powerpoint的主UI在不可见的备用桌面上加载)。这可能是您需要仔细测试的。 creating an alternate Window Station也可以避免这个问题,但由于窗口站是进程全局的,因此在这种情况下,您需要生成一个辅助子进程来处理与powerpoint的交互。

您还可以尝试使用Windows Message Hook来确定窗口的创建时间并使其不可见。这也有一些警告:

  • 您必须找到一种可靠的方法来识别感兴趣的窗口(窗口类名称?)
  • 如果powerpoint是一个进程外服务器,则会有一个窗口,您的挂钩处于活动状态,可能会隐藏错误的进度对话框(即属于另一个进程的对话框)。为了最大限度地减少这种可能性,请测试powerpoint是否在进行中(在这种情况下,将钩子编程为仅影响您自己的进程),如果没有,则安排钩子仅在禁止所需的最短时间内处于活动状态进度窗口。
  • 未来的powerpoint版本可能会破坏您用于识别感兴趣窗口的任何方法。你无能为力。

答案 1 :(得分:1)

您可以尝试将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,则会收到“不允许隐藏应用程序窗口”错误。