C# 阻止子进程创建可见窗口?
我正在尝试使用办公自动化(PIA)将一些C# 阻止子进程创建可见窗口?,c#,.net,windows,pinvoke,C#,.net,Windows,Pinvoke,我正在尝试使用办公自动化(PIA)将一些.pptx文档转换为其他格式。然而,PowerPoint坚持显示进度条,即使主窗口是隐藏的 我有没有办法阻止PowerPoint在主桌面上显示任何窗口 额外资料: 我主要使用C#,COM-PIA进行办公室互操作。但我不怕挖掘C++:P 我开始使用像这样的PIA制作PowerPoint var app = new PowerPoint.Application(); var ppt = app.Presentations.Open("my.pptx"); /
.pptx
文档转换为其他格式。然而,PowerPoint坚持显示进度条,即使主窗口是隐藏的
我有没有办法阻止PowerPoint在主桌面上显示任何窗口
额外资料:
我主要使用C#,COM-PIA进行办公室互操作。但我不怕挖掘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();
在调用powerpoint流程之前,可以使用该调用创建备用桌面。这将确保powerpoint创建的窗口不可见。然而,这里有一些警告:
- 您需要在另一个线程中执行此操作;您不想更改主GUI线程上的桌面
- 最好在一个有备用桌面的专用线程上初始化powerpoint一次,并将其保持在同一线程上,直到终止。这确保了它不会因为从多个桌面调用而混淆
- 如果powerpoint弹出任何类型的对话框,用户将无法回答,除非您将其切换到备用桌面以与powerpoint交互
- 如果powerpoint是进程外服务器,则可能会发生错误(powerpoint加载到备用桌面上,然后用户尝试手动打开powerpoint,此时powerpoint的主UI加载到不可见的备用桌面上)。这可能是您需要仔细测试的内容。这个问题也可以通过避免,但由于窗口站是全局进程,所以在这种情况下,您需要生成一个助手子进程来处理与powerpoint的交互
- 您必须找到一些可靠的方法来识别感兴趣的窗口(窗口类名?)
- 如果powerpoint是进程外服务器,则会出现一个窗口,其中挂钩处于活动状态,可能会隐藏错误的进度对话框(即,属于另一个进程的对话框)。为了最大限度地减少这种可能性,请测试powerpoint是否正在进行(在这种情况下,对挂钩进行编程以仅影响您自己的进程),如果没有,请安排挂钩仅在抑制进度窗口所需的最短时间内处于活动状态
- 将来的powerpoint版本可能会破坏您用来识别感兴趣窗口的任何方法。你对此无能为力
应用程序.Visible
属性与其默认值一起保留,并将MsoTriState.msoFalse
传递给WithWindow
参数:
var application = new Application();
var document = application.Presentations.Open(fileName, MsoTriState.msoFalse, MsoTriState.msoFalse,
WithWindow: MsoTriState.msoFalse);
如果显式设置<代码>应用程序。可见属性到<代码> MSORistist.MSOLALSE >将获得“隐藏应用程序窗口不允许”的错误。< /P> HI、C++或C?你能告诉我们你是如何创建和使用powerpoint应用程序的吗?@Davide Piras:这是最新的细节Hanks,你的回答非常全面。经过长时间的试用,我放弃了:CreateDesktop不工作。这是PowerPoint的一个特点,但它坚持在WinSta0\Default上显示;我没有深入尝试过其他Windows站点,但它需要提升权限,这打破了我的要求:(@kizzx2,也试试钩子技术,你可能会更幸运。