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

kiz*_*zx2 5 .net c# windows pinvoke

我正在尝试使用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();
Run Code Online (Sandbox Code Playgroud)

bdo*_*lan 4

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

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

您还可以尝试使用Windows 消息挂钩来确定窗口何时创建并保持其不可见。这也有一些注意事项:

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