Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 阻止子进程创建可见窗口?_C#_.net_Windows_Pinvoke - Fatal编程技术网

C# 阻止子进程创建可见窗口?

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"); /

我正在尝试使用办公自动化(PIA)将一些
.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,也试试钩子技术,你可能会更幸运。