您好,登錄后才能下訂單哦!
怎么在C#中利用多進程打開PPT?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
PPT文件打開和操作是在一個進程中進行的,如果對多個PPT進行操作,PowerPoint進程默認會以阻塞的方式依次進行,如果打開的PPT特別大(比如超過1GB)很容易造成PPT無響應(yīng),這樣幾乎所有的PPT操作都無法進行。
解決PPT無響應(yīng)的一種方式是定時檢測PPT進程(POWERPNT.exe)是否無響應(yīng),如果無響應(yīng)就將POWERPNT.exe進程Kill掉,重新打開PPT。這種方式并不能解決需要多個PPT操作的問題,如果多個PPT文件都很大,操作多個PPT會頻繁出現(xiàn)PPT無響應(yīng)的情況。
解決PPT無響應(yīng)的另一種方式是使用多進程方式打開PPT。PPT默認是無法使用多個進程打開的,在使用不同用戶打開PPT的情況下,可以打開不同的PPT進程,其原因見參考文檔。
使用多用戶打開PPT的方法,首先需要內(nèi)置不同的用戶,這可以通過代碼實現(xiàn)(需要管理員權(quán)限),也能通過Windows用戶設(shè)置添加指定的用戶。使用代碼操作用戶稍后會有參考代碼。
其次是使用指定用戶(及密碼)啟動封裝好PPT操作的進程,然后通過進程間通信的方式(管道、COPYDATA 消息、MQTT,推薦管道或者COPYDATA消息,不用依賴第三方庫)進行PPT控制(打開、翻頁、跳轉(zhuǎn)、媒體控制等)。
(1)使用指定用戶打開進程的代碼片段(args參數(shù)可以傳遞管道名稱或者自定義消息)
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 { //以只讀方式打開,方便操作結(jié)束后保存 //使用一個不可能為密碼的值(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; //獲取頁數(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); } }
看完上述內(nèi)容,你們掌握怎么在C#中利用多進程打開PPT的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。