WebBrowser控件应用:播放PPT文件

一开始想的是用webform来做,用iframe加载文件,把ppt文件另存成htm,然后播放。 可是后来发现,的程序不大容易控制,所以改用winform

winform下也有不同的选择,首先可以直接生成一个OfficePPTAppellation对象,然后随你怎么播放都可以了,还能动态编辑。不过对于小项目,觉得这样有点麻烦了。后来就选择使用webbrowder控件来播放。

WebBrowser控件真是个好玩意,出了htm,很多格式都没问题。图片啊,word啊什么的都能跑。Ppt自然也可以,flashavi也行(嵌入一次就好了), 除了第一次播放的时候有个询问是否打开,以后播放的问题不大。

Webbrowser控件之所以能播放,其实还是调用的客户端上安装的组件。

但是在真正做的时候就遇到一个问题:每次播放的PPT都只到第二页,然后就不能自动循环播放了。另存了pps文件,也是不行。后来发现,只要用鼠标点击一次下一页,其他就没有问题了。

解决的办法有两个

1:调试为什么停下来不播放了,解决根本。

   OnNavigating事件里面发现,每次播放ppt时的地址居然是这样的:path/xx.ppt#3 后边的3就是当前页号。这个倒是和播放htm传个id什么的类似。根据这个信息,主动调用到某一个页面是没有问题了。这是个意外的发现。继续调试。从页面第一次加载,看起来一切正常,就是播放到第二个之后停止自动播放。

    根据传地址的格式,我尝试一开始就播放第二页,可是结果一样,第三页的时候停止。看来,可不是从第几页开始的问题,而是他就只能播放到第二页,然后停止。

    这时候我想看看能不能通过webbrowser所加载的组建来处理。通常情况下,比如加载一个htm页面,那么webbrowser.Document对象就是htm的内容,然后可以遍历整个htm的对象,做一些操作。那么,如果webbrowser加载的是PPT的话,这个Document属性是什么呢?是否可以通过这个对象来执行ppt播放呢?他应该提供这样恶API的。

    于是跟踪看看,结果发现它什么也不是,是个null。在webbrowser中找不到播放ppt的对象,也就是无法调用其api了(在webbrowser其他的属性里面,能找到一个basedocm对象,但是也无法使用)。

2:模拟鼠标点击,也算是解决了。

   第一种方法不能解决,就只有下x一点,模拟鼠标点击了。在每次加载完PPT之后,模拟鼠标点击“下一页”。这个按钮就在整个webbrowser控件的右下角。

   模拟方法比较简单,就是引入user32.dll,然后组装一下就好了。

   这是个简单的代码:

       public class VirtualMouse

    {

        [DllImport("user32.dll")]

        static extern bool SetCursorPos(int X, int Y);

        [DllImport("user32.dll")]

        static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);

        [Flags]

        public enum MouseEventFlag : uint

        {

           Move = 0x0001,

            LeftDown = 0x0002,

            LeftUp = 0x0004,

            RightDown = 0x0008,

            RightUp = 0x0010,

            MiddleDown = 0x0020,

            MiddleUp = 0x0040,

            XDown = 0x0080,

            XUp = 0x0100,

            Wheel = 0x0800,

            VirtualDesk = 0x4000,

            Absolute = 0x8000

        }

        public void SetCursorPosition(int x, int y)

        {

            VirtualMouse.SetCursorPos(x, y);

        }

        public void MouseEvent(MouseEventFlag flag)

        {

            mouse_event(flag, 0, 0, (uint)0, (UIntPtr)0);

        }

    

    }

   剩下的问题就简单了,直接计算一下那个按钮的位置,然后模拟点击,done

   VirtualMouse vm = new VirtualMouse();

            vm.SetCursorPosition(x, y);

            vm.MouseEvent(VirtualMouse.MouseEventFlag.LeftDown);

            System.Threading.Thread.Sleep(500);

            vm.MouseEvent(VirtualMouse.MouseEventFlag.LeftUp);

你可能感兴趣的:(WebBrowser)