C# 多進(jìn)程打開(kāi)PPT的示例教程
1、背景
PPT文件打開(kāi)和操作是在一個(gè)進(jìn)程中進(jìn)行的,如果對(duì)多個(gè)PPT進(jìn)行操作,PowerPoint進(jìn)程默認(rèn)會(huì)以阻塞的方式依次進(jìn)行,如果打開(kāi)的PPT特別大(比如超過(guò)1GB)很容易造成PPT無(wú)響應(yīng),這樣幾乎所有的PPT操作都無(wú)法進(jìn)行。
解決PPT無(wú)響應(yīng)的一種方式是定時(shí)檢測(cè)PPT進(jìn)程(POWERPNT.exe)是否無(wú)響應(yīng),如果無(wú)響應(yīng)就將POWERPNT.exe進(jìn)程Kill掉,重新打開(kāi)PPT。這種方式并不能解決需要多個(gè)PPT操作的問(wèn)題,如果多個(gè)PPT文件都很大,操作多個(gè)PPT會(huì)頻繁出現(xiàn)PPT無(wú)響應(yīng)的情況。
解決PPT無(wú)響應(yīng)的另一種方式是使用多進(jìn)程方式打開(kāi)PPT。PPT默認(rèn)是無(wú)法使用多個(gè)進(jìn)程打開(kāi)的,在使用不同用戶(hù)打開(kāi)PPT的情況下,可以打開(kāi)不同的PPT進(jìn)程,其原因見(jiàn)參考文檔。
2、具體方法
使用多用戶(hù)打開(kāi)PPT的方法,首先需要內(nèi)置不同的用戶(hù),這可以通過(guò)代碼實(shí)現(xiàn)(需要管理員權(quán)限),也能通過(guò)Windows用戶(hù)設(shè)置添加指定的用戶(hù)。使用代碼操作用戶(hù)稍后會(huì)有參考代碼。
其次是使用指定用戶(hù)(及密碼)啟動(dòng)封裝好PPT操作的進(jìn)程,然后通過(guò)進(jìn)程間通信的方式(管道、COPYDATA 消息、MQTT,推薦管道或者COPYDATA消息,不用依賴(lài)第三方庫(kù))進(jìn)行PPT控制(打開(kāi)、翻頁(yè)、跳轉(zhuǎn)、媒體控制等)。
3、參考代碼
(1)使用指定用戶(hù)打開(kāi)進(jìn)程的代碼片段(args參數(shù)可以傳遞管道名稱(chēng)或者自定義消息)
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
{
//以只讀方式打開(kāi),方便操作結(jié)束后保存
//使用一個(gè)不可能為密碼的值(AssemblyGuid)作為密碼打開(kāi)PPT,保證有密碼時(shí)打開(kāi)失敗
var presentation = ppt.Presentations.Open(
$"{filePath}::{Password}",
MsoTriState.msoTrue, //ReadOnly: true
MsoTriState.msoTrue, //Untitled: true
MsoTriState.msoFalse); //WithWindow: false
//獲取真實(shí)寬高
var officeWidth = presentation.PageSetup.SlideWidth;
var officeHeight = presentation.PageSetup.SlideHeight;
//獲取頁(yè)數(shù)
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# 多進(jìn)程打開(kāi)PPT的示例教程的詳細(xì)內(nèi)容,更多關(guān)于C# 多進(jìn)程打開(kāi)PPT的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C# / VB.NET 在PPT中創(chuàng)建、編輯PPT SmartArt圖形的方法詳解
- C# 實(shí)現(xiàn)PPT 每一頁(yè)轉(zhuǎn)成圖片過(guò)程解析
- C#將PPT文件轉(zhuǎn)換成PDF文件
- C#如何添加PPT背景
- C# 實(shí)現(xiàn)對(duì)PPT文檔加密、解密及重置密碼的操作方法
- C#提取PPT文本和圖片的實(shí)現(xiàn)方法
- C# 使用Free Spire.Presentation 實(shí)現(xiàn)對(duì)PPT插入、編輯、刪除表格
- 在C#里面給PPT文檔添加注釋的實(shí)現(xiàn)代碼
- C#向PPT文檔插入圖片以及導(dǎo)出圖片的實(shí)例
- C#實(shí)現(xiàn)將PPT轉(zhuǎn)換成HTML的方法
- word ppt excel文檔轉(zhuǎn)換成pdf的C#實(shí)現(xiàn)代碼
- C#/VB.NET 自定義PPT動(dòng)畫(huà)路徑的步驟
相關(guān)文章
C# 設(shè)計(jì)模式系列教程-狀態(tài)模式
狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同的一系列類(lèi)當(dāng)中,可以把復(fù)雜的邏輯判斷簡(jiǎn)單化。2016-06-06
C#給圖片加水印的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了C#給圖片加水印的簡(jiǎn)單實(shí)現(xiàn)方法,涉及C#操作圖片的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
SQLite之C#版 System.Data.SQLite使用方法
這篇文章主要介紹了SQLite之C#版 System.Data.SQLite使用方法,需要的朋友可以參考下2020-10-10
C#采用OpenXml實(shí)現(xiàn)給word文檔添加文字
這篇文章主要介紹了C#采用OpenXml實(shí)現(xiàn)給word文檔添加文字的方法,包括了用法的實(shí)例分析,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09
C#統(tǒng)計(jì)字符串中數(shù)字個(gè)數(shù)的方法
這篇文章主要介紹了C#統(tǒng)計(jì)字符串中數(shù)字個(gè)數(shù)的方法,涉及C#遍歷字符串并判斷數(shù)字的技巧,需要的朋友可以參考下2015-06-06
C#面向?qū)ο筇卣鞯木唧w實(shí)現(xiàn)及作用詳解
所有的面相對(duì)象思想,歸根結(jié)底是為了簡(jiǎn)化代碼,減少代碼量,構(gòu)建更符合現(xiàn)實(shí)生活邏輯的程序代碼,從而減輕程序員的負(fù)擔(dān)。不能一味地或者說(shuō)刻意地去使用面相對(duì)象的思想而忽略了程序所實(shí)現(xiàn)的功能或者框架,要根據(jù)實(shí)際情況2013-10-10

