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的资料请关注其它相关文章!
上一篇: VBS教程:对象-Dictionary
下一篇: VBS获取重定向的URL的代码