【问题标题】:Prevent child process from creating visible windows?防止子进程创建可见窗口?
【发布时间】:2011-02-24 14:22:31
【问题描述】:

我正在尝试使用 Office 自动化 (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();

【问题讨论】:

  • 嗨,c++ 还是 c#?您能告诉我们您是如何创建和使用该 powerpoint 应用程序的吗?
  • @Davide Piras:这是更新的详细信息

标签: c# .net windows pinvoke


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,您的回答非常全面。经过长时间的尝试,我放弃了: CreateDesktop 不起作用。这是 PowerPoint 的一个特点,但它只是坚持在 WinSta0\Default 上显示;我还没有深入尝试过备用 Windows 站,但它需要提升的权限,这违反了我的要求:(
  • @kizzx2,你也可以试试钩子技术,你可能会更幸运。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-09-20
    • 2010-11-11
    • 2021-12-01
    • 1970-01-01
    • 2010-09-08
    • 2012-07-17
    • 1970-01-01
    • 2015-06-12
    • 2019-06-11
    相关资源
    最近更新 更多