C# 多进程打开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参数可以传递管道名称或者自定义消息)
publicvoidStartProcess(stringfileName,stringuserName,stringpassword,stringargs)
{
varpwd=newSecureString();
if(!string.IsNullOrEmpty(password))
{
password.ToCharArray().ToList().ForEach(c=>pwd.AppendChar(c));
}
try
{
varprocess=newProcess
{
StartInfo=
{
UseShellExecute=false,
LoadUserProfile=true,
UserName=userName,
Password=pwd,
Domain=".",
FileName=$"\"{fileName}\"",
Arguments=args
}
};
process.Start();
}
finally
{
pwd.Dispose();
}
}
(2)PPT操作片段
privatevoidOpenPpt()
{
varapp=newMicrosoft.Office.Interop.PowerPoint.Application();
}
privatevoidClosePpt(refApplicationapp)
{
try
{
app?.Quit();
}
catch(Exceptione)
{
Console.WriteLine(e.Message);
}
app=null;
GC.Collect();
}
publicvoidOpen(objectapp,stringfilePath)
{
varppt=appasMicrosoft.Office.Interop.PowerPoint.Application;
if(ppt==null)
{
return;
}
//正斜杠替换为反斜杠
filePath=filePath.Replace('/','\\');
try
{
//以只读方式打开,方便操作结束后保存
//使用一个不可能为密码的值(AssemblyGuid)作为密码打开PPT,保证有密码时打开失败
varpresentation=ppt.Presentations.Open(
$"{filePath}::{Password}",
MsoTriState.msoTrue,//ReadOnly:true
MsoTriState.msoTrue,//Untitled:true
MsoTriState.msoFalse);//WithWindow:false
//获取真实宽高
varofficeWidth=presentation.PageSetup.SlideWidth;
varofficeHeight=presentation.PageSetup.SlideHeight;
//获取页数
varpageNumber=presentation.Slides.Count;
varslideShowSettings=presentation?.SlideShowSettings;
if(slideShowSettings==null)
{
return;
}
varwindow=slideShowSettings.Run();
}
catch(Exceptione)
{
Console.WriteLine(e.Message);
}
}
publicvoidClose(SlideShowWindowwindow)
{
try
{
window?.View.Exit();
}
catch(Exceptione)
{
Console.WriteLine(e.Message);
}
}
publicvoidGotoSlide(SlideShowWindowwindow,intindex)
{
try
{
window?.View.GotoSlide(index);
}
catch(Exceptione)
{
Console.WriteLine(e.Message);
}
}
publicvoidNext(SlideShowWindowwindow)
{
try
{
window?.View.Next();
}
catch(Exceptione)
{
Console.WriteLine(e.Message);
}
}
publicvoidPrevious(SlideShowWindowwindow)
{
try
{
window?.View.Previous();
}
catch(Exceptione)
{
Console.WriteLine(e.Message);
}
}
以上就是C#多进程打开PPT的示例教程的详细内容,更多关于C#多进程打开PPT的资料请关注毛票票其它相关文章!