欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-21 11:32:49
1、背景ppt文件打开和操作是在一个进程中进行的,如果对多个ppt进行操作,powerpoint进程默认会以阻塞的方式依次进行,如果打开的ppt特别大(比如超过1gb)很容易造成ppt无响应,这样几乎...

1、背景

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

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

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

2、具体方法

使用多用户打开ppt的方法,首先需要内置不同的用户,这可以通过代码实现(需要管理员权限),也能通过windows用户设置添加指定的用户。。

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

3、参考代码

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

public void startprocess(string filename, string username, string password, string args)
{
 var pwd = new securestring();
 if (!string.isnullorempty(password))
 {
  password.tochararray().tolist().foreach(c => pwd.appendchar(c));
 }

 try
 {
  var process = new process
  {
   startinfo =
   {
    useshellexecute = false,
    loaduserprofile = true,
    username = username,
    password = pwd,
    domain = ".",
    filename = $"\"{filename}\"",
    arguments = args
   }
  };
  process.start();
 }
 finally
 {
  pwd.dispose();
 }
}

(2)ppt操作片段

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的示例教程的详细内容,更多关于c# 多进程打开ppt的资料请关注其它相关文章!