C# 多进程打开PPT的示例教程

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: true
   MsoTriState.msoTrue, //Untitled: true
   MsoTriState.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: true
   MsoTriState.msoTrue, //Untitled: true
   MsoTriState.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的示例教程的详细内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值