介绍
怎么在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