none
请问如何在播放状态下切换PPT页面时候触发事件 RRS feed

  • 问题

  • 各位大佬好,第一次发帖,有不规范的地方请多包涵。

    是这样的,目前使用的是VS2019开发2016版本PPT,我目前注册了一个按钮,事件为点击可以弹出一个面板(panel),面板上有另外的按钮。目前的逻辑是切换页面时,自动关闭该面板以及面板上的按钮派生的面板/窗口,我该在 Application_SlideSelectionChanged()里面写逻辑吗。还有个问题,VSTO有可以检测PPT处于播放状态的类或者对象属性吗~

    谢谢!

    2020年6月11日 9:58

答案

  • Hi Travis,

    首先你需要安装Microsoft.Office.Interop.PowerPoint nuget 包。

    其次,你可以使用下面的代码来实现你的需求。

    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Microsoft.Office.Interop.PowerPoint.Application ppt = new Microsoft.Office.Interop.PowerPoint.Application();
                ppt.WindowSelectionChange += Ppt_WindowSelectionChange;
                Control.CheckForIllegalCrossThreadCalls = false;
            }
    
            private void Ppt_WindowSelectionChange(Microsoft.Office.Interop.PowerPoint.Selection Sel)
            {
                panel1.Visible = false;
            }
    
            Panel panel1 = new Panel();
            private void button1_Click(object sender, EventArgs e)
            {
                panel1.Visible = true;
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                panel1.Location = new Point(56, 72);
                panel1.Size = new Size(264, 152);
                // Set the Borderstyle for the Panel to three-dimensional.
                panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
                Button button1 = new Button();
                button1.Location = new Point(16, 32);
                button1.Text = "test11";
                button1.Size = new Size(152, 20);
                this.Controls.Add(panel1);
                // Add the Label and TextBox controls to the Panel.
                panel1.Controls.Add(button1);
                panel1.Visible = false;
            }
        }
    }

    这是相关结果:

    你也可以使用下面的代码来检测PPT的播放状态。

        private void button2_Click(object sender, EventArgs e)
            {
                Process[] prozesse = Process.GetProcesses();
                foreach (Process p in prozesse)
                {
                    if (p.ProcessName == "POWERPNT")
                    {
                        try
                        {
                            Microsoft.Office.Interop.PowerPoint.Application PPT =
                            new Microsoft.Office.Interop.PowerPoint.Application();
                            if (PPT.SlideShowWindows.Count > 0)
                            {
                                MessageBox.Show("PPT is playing");
                            }
                            else
                            {
                                MessageBox.Show("PPT is not playing");
                            }
                               
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                    }
                }
            }

    希望这会帮到你。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 Travis Tan 2020年6月15日 3:16
    2020年6月12日 7:00
    版主

全部回复

  • Hi Travis,

    首先你需要安装Microsoft.Office.Interop.PowerPoint nuget 包。

    其次,你可以使用下面的代码来实现你的需求。

    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Microsoft.Office.Interop.PowerPoint.Application ppt = new Microsoft.Office.Interop.PowerPoint.Application();
                ppt.WindowSelectionChange += Ppt_WindowSelectionChange;
                Control.CheckForIllegalCrossThreadCalls = false;
            }
    
            private void Ppt_WindowSelectionChange(Microsoft.Office.Interop.PowerPoint.Selection Sel)
            {
                panel1.Visible = false;
            }
    
            Panel panel1 = new Panel();
            private void button1_Click(object sender, EventArgs e)
            {
                panel1.Visible = true;
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                panel1.Location = new Point(56, 72);
                panel1.Size = new Size(264, 152);
                // Set the Borderstyle for the Panel to three-dimensional.
                panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
                Button button1 = new Button();
                button1.Location = new Point(16, 32);
                button1.Text = "test11";
                button1.Size = new Size(152, 20);
                this.Controls.Add(panel1);
                // Add the Label and TextBox controls to the Panel.
                panel1.Controls.Add(button1);
                panel1.Visible = false;
            }
        }
    }

    这是相关结果:

    你也可以使用下面的代码来检测PPT的播放状态。

        private void button2_Click(object sender, EventArgs e)
            {
                Process[] prozesse = Process.GetProcesses();
                foreach (Process p in prozesse)
                {
                    if (p.ProcessName == "POWERPNT")
                    {
                        try
                        {
                            Microsoft.Office.Interop.PowerPoint.Application PPT =
                            new Microsoft.Office.Interop.PowerPoint.Application();
                            if (PPT.SlideShowWindows.Count > 0)
                            {
                                MessageBox.Show("PPT is playing");
                            }
                            else
                            {
                                MessageBox.Show("PPT is not playing");
                            }
                               
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                    }
                }
            }

    希望这会帮到你。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 Travis Tan 2020年6月15日 3:16
    2020年6月12日 7:00
    版主
  • 十分感谢您的回答!

    按照您的回答,您的具体逻辑是放在

    ppt.WindowSelectionChange()下执行。

    抱歉,我的提问不够具体,具体是在播放幻灯片时候,切换页面时候,触发隐藏panel 重新加载工具按钮的操作。

    因为我注意到,this.application类下有两个方法,e.g:
     this.Application.SlideSelectionChanged += Application_SlideSelectionChanged;
     this.Application.WindowSelectionChange += selectionChange;

    我该选择在哪一个方法下填写,以及此两个方法实际表现异同呢?

    以及,作为入门开发者,是否存在有PPT addin 类 的文档说明以及api文档 ?

    再次万分感谢您百忙中给出我宝贵的回复!

    Travis

    2020年6月15日 7:12