怎么在c#中利用多进程打开PPT

  介绍

怎么在c#中利用多进程打开PPT ?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1,背景

PPT文件打开和操作是在一个进程中进行的,如果对多个PPT进行操作,PowerPoint进程默认会以阻塞的方式依次进行,如果打开的PPT特别大(比如超过1 gb)很容易造成PPT无响应,这样几乎所有的PPT操作都无法进行。

解决PPT无响应的一种方式是定时检测PPT进程(POWERPNT.exe)是否无响应,如果无响应就将POWERPNT。exe进程杀死掉,重新打开PPT。这种方式并不能解决需要多个PPT操作的问题,如果多个PPT文件都很大,操作多个PPT会频繁出现PPT无响应的情况。

解决PPT无响应的另一种方式是使用多进程方式打开PPT.PPT默认是无法使用多个进程打开的,在使用不同用户打开PPT的情况下,可以打开不同的PPT进程,其原因见参考文档。

2,具体方法

使用多用户打开PPT的方法,首先需要内置不同的用户,这可以通过代码实现(需要管理员权限),也能通过窗户用户设置添加指定的用户。使用代码操作用户稍后会有参考代码。

其次是使用指定用户(及密码)启动封装好PPT操作的进程,然后通过进程间通信的方式(管道,COPYDATA消息,MQTT,推荐管道或者COPYDATA消息,不用依赖第三方库)进行PPT控制(打开,翻页,跳转,媒体控制等).

3,参考代码

(1)使用指定用户打开进程的代码片段(args参数可以传递管道名称或者自定义消息)

public  void  StartProcess (string ,文件名,string 用户名,string 密码,string  args)   {   ,var  pwd =, new  SecureString ();   (!,if  string.IsNullOrEmpty(密码))   ,{   .ToList password.ToCharArray才能()().ForEach (c =祝辞,pwd.AppendChar (c));   ,}      ,试一试   ,{   var 才能;process =, new 过程   {才能   ,,StartInfo =,,{   ,,,UseShellExecute =,假的,   ,,,LoadUserProfile =,真的,   ,,,UserName =,用户名,   ,,,Password =, pwd,   ,,,Domain =,“干净,   ,,,FileName =,“美元\“{文件名}\““,   ,,,Arguments =参数   ,,}   ,,};   process.Start才能();   ,}   ,最后   ,{   pwd.Dispose才能();   ,}   }

(2) PPT操作片段

private  void  OpenPpt ()   {   ,var  app =, new  Microsoft.Office.Interop.PowerPoint.Application ();   }      private  void  ClosePpt (ref  Application 应用程序)   {   ,试一试   ,{   应用程序才能? .Quit ();   ,}   ,catch  (Exception  e)   ,{   Console.WriteLine才能(e.Message);   ,}=,app 零;   ,GC.Collect ();   }      public  void 开放(object 应用,,string  filePath)   {   ,var  ppt =, app  as  Microsoft.Office.Interop.PowerPoint.Application;   ,if  (ppt ==, null)   ,{   返回才能;   ,}      ,//正斜杠替换为反斜杠=,,filePath  filePath.Replace (& # 39;/& # 39;,, & # 39; \ \ & # 39;);      ,试一试   ,{//以才能只读方式打开,方便操作结束后保存//使才能用一个不可能为密码的值(AssemblyGuid)作为密码打开PPT,保证有密码时打开失败   var 才能;presentation =, ppt.Presentations.Open (   美元,才能“{filePath}:{密码}“,   ,,MsoTriState.msoTrue,//只读的:,真的   ,,MsoTriState.msoTrue,,//Untitled:真实   ,,MsoTriState.msoFalse);//WithWindow:,假//才能获取真实宽高   var 才能;officeWidth =, presentation.PageSetup.SlideWidth;   var 才能;officeHeight =, presentation.PageSetup.SlideHeight;//才能获取页数   var 才能;pageNumber =, presentation.Slides.Count;      var 才能;slideShowSettings =,演讲? .SlideShowSettings;   if 才能;(slideShowSettings ==, null)   {才能   ,才能回报;   ,,}      var 才能;window =, slideShowSettings.Run ();   ,}   ,catch  (Exception  e)   ,{   Console.WriteLine才能(e.Message);   ,}   }      public  void 密切(SlideShowWindow 窗口)   {   ,试一试   ,{   窗口才能? .View.Exit ();   ,}   ,catch  (Exception  e)   ,{   Console.WriteLine才能(e.Message);   ,}   }      public  void  GotoSlide (SlideShowWindow 窗口,int 指数)   {   ,试一试   ,{   窗口才能? .View.GotoSlide(指数);   ,}   ,catch  (Exception  e)   ,{   Console.WriteLine才能(e.Message);   ,}   }      public  void  Next (SlideShowWindow 窗口)   {   ,试一试   ,{   窗口才能? .View.Next ();   ,}   ,catch  (Exception  e)   ,{   Console.WriteLine才能(e.Message);   ,}   }      public  void 之前(SlideShowWindow 窗口)   {   ,试一试   ,{   窗口才能? .View.Previous ();   ,}   ,catch  (Exception  e)   ,{   Console.WriteLine才能(e.Message);   ,}   }

怎么在c#中利用多进程打开PPT