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

标签 c# .net windows pinvoke

我正在尝试使用办公自动化 (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/

相关文章:

.net - 类范围的 Linq 内存中查询

windows - 我目前在 Linux 中使用 SVN。如何从 Windows 桌面添加文件?

c++ - 在 Windows 上增强线程和进程清理

c# - 如何使用 Regex.Split 拆分字符串并保留所有分隔符?

c# - 获取gridview中DataField的列表

c# - 使用 C# 从 NSF 文件中读取 Lotus Notes 文档和项目

c# - 是否可以将 Azure 离线同步与 .Net Core 一起使用

c# - 如何在 linq-to-sql 中返回匿名类型

.net - WCF 客户端(添加服务引用)讨厌 WebGet 和 WebInvoke ...真的,它确实如此

windows - 在 Windows 上安装 PostgreSQL