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參數可以傳遞管道名稱或者自定義消息)

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);
    }
}

4、參考文檔

(1)我是如何讓PowerPoint能夠多進程同時導出的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM