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

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

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

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

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

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

private void OpenPpt()
{var app = new Microsoft.Office.Interop.PowerPoint.Application();
}private void ClosePpt(ref Application app)
{try{app?.Quit();}catch (Exception e){Console.WriteLine(e.Message);}app = null;GC.Collect();
}public void Open(object app, string filePath)
{var ppt = app as Microsoft.Office.Interop.PowerPoint.Application;if (ppt == null){return;}//正斜杠替换为反斜杠filePath = filePath.Replace('/', '\\');try{//以只读方式打开,方便操作结束后保存//使用一个不可能为密码的值(AssemblyGuid)作为密码打开PPT,保证有密码时打开失败var presentation = ppt.Presentations.Open($"{filePath}::{Password}",MsoTriState.msoTrue, //ReadOnly: trueMsoTriState.msoTrue, //Untitled: trueMsoTriState.msoFalse); //WithWindow: false//获取真实宽高var officeWidth = presentation.PageSetup.SlideWidth;var officeHeight = presentation.PageSetup.SlideHeight;//获取页数var pageNumber = presentation.Slides.Count;var slideShowSettings = presentation?.SlideShowSettings;if (slideShowSettings == null){return;}var window = slideShowSettings.Run();}catch (Exception e){Console.WriteLine(e.Message);}
}public void Close(SlideShowWindow window)
{try{window?.View.Exit();}catch (Exception e){Console.WriteLine(e.Message);}
}public void GotoSlide(SlideShowWindow window, int index)
{try{window?.View.GotoSlide(index);}catch (Exception e){Console.WriteLine(e.Message);}
}public void Next(SlideShowWindow window)
{try{window?.View.Next();}catch (Exception e){Console.WriteLine(e.Message);}
}public void Previous(SlideShowWindow window)
{try{window?.View.Previous();}catch (Exception e){Console.WriteLine(e.Message);}
}
private void OpenPpt()
{var app = new Microsoft.Office.Interop.PowerPoint.Application();
}private void ClosePpt(ref Application app)
{try{app?.Quit();}catch (Exception e){Console.WriteLine(e.Message);}app = null;GC.Collect();
}public void Open(object app, string filePath)
{var ppt = app as Microsoft.Office.Interop.PowerPoint.Application;if (ppt == null){return;}//正斜杠替换为反斜杠filePath = filePath.Replace('/', '\\');try{//以只读方式打开,方便操作结束后保存//使用一个不可能为密码的值(AssemblyGuid)作为密码打开PPT,保证有密码时打开失败var presentation = ppt.Presentations.Open($"{filePath}::{Password}",MsoTriState.msoTrue, //ReadOnly: trueMsoTriState.msoTrue, //Untitled: trueMsoTriState.msoFalse); //WithWindow: false//获取真实宽高var officeWidth = presentation.PageSetup.SlideWidth;var officeHeight = presentation.PageSetup.SlideHeight;//获取页数var pageNumber = presentation.Slides.Count;var slideShowSettings = presentation?.SlideShowSettings;if (slideShowSettings == null){return;}var window = slideShowSettings.Run();}catch (Exception e){Console.WriteLine(e.Message);}
}public void Close(SlideShowWindow window)
{try{window?.View.Exit();}catch (Exception e){Console.WriteLine(e.Message);}
}public void GotoSlide(SlideShowWindow window, int index)
{try{window?.View.GotoSlide(index);}catch (Exception e){Console.WriteLine(e.Message);}
}public void Next(SlideShowWindow window)
{try{window?.View.Next();}catch (Exception e){Console.WriteLine(e.Message);}
}public void Previous(SlideShowWindow window)
{try{window?.View.Previous();}catch (Exception e){Console.WriteLine(e.Message);}
}

以上就是C# 多进程打开PPT的示例教程的详细内容

C# 多进程打开PPT的示例教程相关推荐

  1. java 设计模式 示例_Java中的状态设计模式–示例教程

    java 设计模式 示例 状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件 ...

  2. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  3. Java设计模式 - 示例教程

    Java设计模式 - 示例教程 设计模式在软件开发人员中非常流行.设计模式是针对常见软件问题的良好描述的解决方案.我已经写了很多关于java设计模式的文章.您可以订阅我们的时事通讯下载PDF电子书(1 ...

  4. Android WebView示例教程

    Android WebView is used to display HTML in an android app. We can use android WebView to load HTML p ...

  5. Python MySQL示例教程

    Welcome to Python MySQL example tutorial. MySQL is one of the most widely used database and python p ...

  6. android 导航抽屉_Android导航抽屉示例教程

    android 导航抽屉 In this tutorial we'll implement a Navigation Drawer in our android application. Androi ...

  7. log4j 配置文件示例_Log4j2示例教程–配置,级别,附加程序

    log4j 配置文件示例 Welcome to the Apache Log4j2 Example Tutorial. If you ask an expert developer about the ...

  8. ppt在服务器上打开要修复,打开ppt提示需要修复怎么办-处理ppt总是提示需要修复的方法 - 河东软件园...

    PPT和word /excel相比较是office组件中使用较少的组件之一,但是它的使用范围是非常广泛的.无论是制作产品的发布会还是学生在学校答辩都需要使用到它,它是我们展示自己的手段之一,如今在很多 ...

  9. 计算机如何打开office,win10电脑没有office软件如何打开ppt文档

    ‍ ‍ 一些用户在网上下载ppt文档,但是自己win10 64位系统电脑并没有安装office办公软件,所以一直打不开ppt,怎么办呢?针对win10电脑没有office软件却打不开ppt文档的问题, ...

最新文章

  1. C++ 双端队列(deque)的使用
  2. java类如何enum_java – 如何模拟ENUM类中的方法?
  3. 学生信息系统求助_Student Information Management -一个简单的学生信息管理系统(持续更新2)...
  4. join 高性能_内置的数据无法实现高性能
  5. 解决vc 6在vista下的一些兼容问题
  6. WinAPI: 钩子回调函数之 MouseProc
  7. python输入一个整数列表 列表元素为18_Python-18 (高级变量1--列表)
  8. Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth
  9. python小工具—图片拼接PDF
  10. VS2019 打包WPF安装程序最新教程(图文详解)
  11. 无线ac管理服务器调试方法,AC功能管理无线AP设置步骤
  12. 《图解HTTP》笔记
  13. Pr入门系列之三:新建序列
  14. Viojs P1484 ISBN号码
  15. 苹果支付 php,【苹果支付二】apple pay苹果支付以及自动续订订阅开发 - Laravel学习网...
  16. 远程访问服务器上的MySQL数据库
  17. 10个可爱的外国互动型网站
  18. 使用Python操作XLS文件(wps中叫et)
  19. qt下生成mysql驱动_Qt编译MySQL驱动
  20. 北京、上海家庭年收入情况统计 (zz)

热门文章

  1. 怀旧服服务器能容纳多少人同时在线,《魔兽世界》怀旧服国服在线人数有多少 在线人数统计介绍...
  2. linux 进程状态 rl,Linux进程状态详解
  3. Python遇错:ModuleNotFoundError: No module named ‘IPython‘解决办法。
  4. linux安装 python3-pip没有安装候选项
  5. 隐喻--启发 更深刻的理解
  6. 真正成熟的男人不做的12件事
  7. Zend Framework——PDF
  8. 宝塔linux面板重启、重置等命令
  9. 把Satellite menu/RadialMenu这两个结合起来可以做出来很牛X的效果
  10. Idea首次提交项目到新建的git仓库