c# Winform 程序嵌入PPT

记录一下,嵌入ppt程序遇到的问题。。。。。。。。。。。。。。。。。。。。。。。。。。。

在网上找了很多资料,关于嵌入ppt浏览ppt的例子和方法,使用下来都是一大推问题。。

最后选择了打开ppt程序,把ppt程序嵌入页面UI中这个方法,但同样问题都一抹多,庆幸问题最后都有惊无险解决掉了

1、office asstant 没有安装

在程序中第一次写下代码,直接打开ppt程序,当时就抛异常:office asstant not install.

using POWERPOINT = Microsoft.Office.Interop.PowerPoint;
using OFFICECORE = Microsoft.Office.Core;

objApp = new POWERPOINT.Application();

objPresSet = objApp.Presentations.Open(filePath, OFFICECORE.MsoTriState.msoTrue, OFFICECORE.MsoTriState.msoTrue, OFFICECORE.MsoTriState.msoFalse);

搞人心态,网上也查不到什么原因,难道大家都没有遇到过吗。。

其实我估计也是office环境问题,同事运行我这段代码是没问题的,最后把同事的office环境给搞过来了。

原来我用的office是2013版本的,最后换成了2016,然后安装了三个插件,不知道是版本还是插件问题,没下去深究。

2、第一次打开ppt并浏览了后,关闭界面,然后第二次浏览ppt,究抛异常了,原因是第一次打开的ppt程序并没有关闭。。。怪自己太辣鸡了,技术差,哈哈哈

下面是ppt嵌入的效果,没有直接嵌入ppt编辑界面,直接嵌入的是ppt的播放界面。

 

最后贴一段代码,打开ppt嵌入界面的。


using POWERPOINT = Microsoft.Office.Interop.PowerPoint;
using OFFICECORE = Microsoft.Office.Core;

POWERPOINT.Application objApp = null;
POWERPOINT.Presentation objPresSet = null;
POWERPOINT.SlideShowWindows objSSWs;

[DllImport("user32.dll")]
public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int fLag);

public void PPTOpen(string filePath)
        {
            try
            {
                //打开一个ppt程序
                objApp = new POWERPOINT.Application();
                ShowWindow((IntPtr)objApp.HWND, SW_HIDE);

                //打开一个ppt,隐藏编辑窗口.
                //Open的三个参数:ppt路径,是否只读,是否显示标题,是否显示ppt编辑界面
                objPresSet = objApp.Presentations.Open(filePath, OFFICECORE.MsoTriState.msoTrue, OFFICECORE.MsoTriState.msoTrue, OFFICECORE.MsoTriState.msoFalse);

                //objPresSet.SlideShowSettings.ShowType这个属性值建议自己去尝试,每个对应的    值会有不同的惊喜哦,就不贴每个属性对应值得效果图了
                objPresSet.SlideShowSettings.ShowType = PpSlideShowType.ppShowTypeWindow;


                //设置该属性是为了防止ppt播放完毕后弹出是否保存界面
                objPresSet.Saved = OFFICECORE.MsoTriState.msoTrue;
                objSlides = objPresSet.Slides;
                if (objSlides.Count == 0)
                {
                    MessageBox.Show("空白幻灯片,不能播放");
                    return;
                }

                //开始播放ppt
                objSSS = this.objPresSet.SlideShowSettings;
                slideShowWindow = objSSS.Run();

                //没嵌入之前隐藏播放窗口
                ShowWindow(GetParent(GetParent((IntPtr)slideShowWindow.HWND)), SW_HIDE);
 

                //移动ppt程序界面到程序中 slideShowWindow.HWND传入的是ppt播放界面的句柄,如果                
                //想嵌入ppt编辑界面,也可传objApp.HWND
                EmbedProcessEx((IntPtr)slideShowWindow.HWND, panelTeachContent);
            }
            catch (Exception ex)
            {

            }
        }
 private bool EmbedProcessEx(IntPtr nHwnd, Control control)
        {

            IntPtr hwnd = (IntPtr)nHwnd;
            
            if (control == null || hwnd == IntPtr.Zero) return false;
            try
            {
                SetParent(hwnd, control.Handle);
                MoveWindow(hwnd, 0, 0, control.Width, control.Height, true);
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;

        }


最后,就酱紫吧。。。。

同理,其他语言也类似,用了w32API的SetParent和MoveWindow

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值