我正在尝试使用办公自动化 (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();
最佳答案
您可以使用 CreateDesktop
在调用 powerpoint 进程之前调用创建备用桌面。这将确保由 powerpoint 创建的窗口不可见。但是,这里有一些注意事项:
- 您需要在备用线程中执行此操作;您不想更改主 GUI 线程上的桌面
- 最好在具有备用桌面的专用线程上初始化 powerpoint 一次,并在您终止之前将其保留在同一个线程上。这确保它不会因从多个桌面调用而混淆。
- 如果 powerpoint 弹出任何类型的对话框,除非您将他们切换到备用桌面以与 powerpoint 交互,否则用户将无法回答。
- 如果 powerpoint 是进程外服务器,则可能会发生不好的事情(powerpoint 在备用桌面上加载,然后用户尝试手动打开 powerpoint,此时 powerpoint 的主 UI 加载到不可见的备用桌面上)。这可能是您需要仔细测试的东西。 creating an alternate Window Station 可以避免此问题同样,但由于窗口站是全局进程,在这种情况下,您需要生成一个辅助子进程来处理与 powerpoint 的交互。
您也可以尝试使用 Windows Message Hook确定何时创建窗口并使其不可见。这也有一些注意事项:
- 您必须找到一些可靠的方法来识别感兴趣的窗口(窗口类名?)
- 如果 powerpoint 是一个进程外服务器,将会有一个窗口,您的 Hook 在其中处于事件状态,并且可能会隐藏错误的进度对话框(即,属于另一个进程的对话框)。为了尽量减少这种机会,请测试 powerpoint 是否在进程中(在这种情况下,将 Hook 编程为只影响您自己的进程),如果不是,则安排 Hook 仅在抑制所需的最短时间内处于事件状态进度窗口。
- future 的 powerpoint 版本可能会破坏您用来识别感兴趣的窗口的任何方法。您对此无能为力。
关于c# - 防止子进程创建可见窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5105869/