随心所欲

做个幸福的人
posts - 141, comments - 1288, trackbacks - 19, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

WebBrowser控件应用:播放PPT文件

Posted on 2007-10-29 09:36 随心所欲 阅读(2114) 评论(3)  编辑 收藏 所属分类: VS2005

一开始想的是用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);

Feedback

#1楼    回复  引用  查看    

2007-10-30 13:53 by 阿牛 - 专注OOP      
第一次播放的时候有个询问是否打开解决了吗?

#2楼 [楼主]   回复  引用  查看    

2007-10-30 14:44 by 随心所欲      
@阿牛 - 专注OOP
选择下次不再询问就可以了.

其实这个选项是放在注册表里的,对这种类型的操作选项.设置它应该就可以.

#3楼    回复  引用  查看    

2008-03-10 14:06 by Richet      
可以把完整代码给我发一份吗?谢谢
最近在做一个关于ppt的东西,有点困惑。。。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-10-29 09:38 编辑过


相关链接:
 




Google