首页 新闻 赞助 找找看

如何使用VSTO去处理PPT的复制操作?

0
悬赏园豆:30 [已关闭问题] 关闭于 2013-02-23 19:01

相对微软office的PPT的复制操作,进行判断处理,对于选中的对象,可以在复制后控制该对象的一些属性、方法,是不是在VS2010中提供了可以调用的事件方法,可以获得这个对象。(也可以理解为禁用PPT的复制操作)

网上的资料,大家对于VSTO开发的,大多是对于Word\Excel\Outlook的,还有一些是使用VB语言写的,但对于PPT的相关操作和示例代码不是很多,有点难度。谁做过类似的开发,碰到过相关的问题,希望能给些建议。

SanMaoSpace的主页 SanMaoSpace | 菜鸟二级 | 园豆:213
提问于:2013-02-06 15:21
< >
分享
所有回答(1)
0

在PPT中控制复制、剪切、粘贴,有几种思路可供提供:(主要右键菜单、快捷键、工具栏的复制、剪切、粘贴)

1.对于快捷键使用键盘钩子控制,对于右键菜单可以使用鼠标钩子控制,对于工具栏的需要命名按钮来控制;

2.可以可以控制微软的系统剪切板和Ofiice剪切板,进行数据的即使清空。Clip.Clear()。

目前还未解决彻底,给个思路。问题链接:http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/b579fa87-8ed9-4982-8b9e-e4c06246841c

SanMaoSpace | 园豆:213 (菜鸟二级) | 2013-02-23 19:01

似乎问题没有这么复制,是我把问题想复杂了。

对于剪切、复制、粘贴,微软都已经通过Ribbon XML命令的形式控制了。

参见资料:
http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/b579fa87-8ed9-4982-8b9e-e4c06246841c
http://social.msdn.microsoft.com/Forums/en-US/worddev/thread/f6344e7b-03d4-4ad4-83fd-fcc29a850963

其实现是(使用Ribbon XML的形式控制命令来实现):

1.在PPT的外接程序中,添加“功能区(XML)”,使用Ribbon XML的形式控制;

2.Ribbon1.xml中三个回调事件"MyCopy"\"MyCut"\"GetInfo":

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">
    <commands>
        <!--PPT中的文件保存功能不能使用-->
        <command idMso="FileSave" enabled="false"/>
        <!--"MyCut"扩展PPT中"剪切"命令的响应事件-->
        <command idMso="Cut" enabled="true" onAction="MyCut"/>
        <command idMso="Copy" enabled="true"  onAction="MyCopy"/>
    </commands>
    <ribbon>
        <tabs>
            <tab idMso="TabAddIns">
                <group id="MyGroup"
                       label="My Group">
                    <button id="MyButton" label="MyButton" onAction="GetInfo"/>
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>

3.在Ribbon1.cs文件中的回调函数的处理:

 /// <summary>
        /// MyButton的回调方法
        /// </summary>
        /// <param name="control"></param>
        public void GetInfo(Office.IRibbonControl control)
        {
            MessageBox.Show("Released");
        }

        /// <summary>
        /// MyCopy的回调方法
        /// </summary>
        /// <param name="control">触发控件</param>
        /// <param name="cancelDefault">是否取消功能</param>
        public void MyCopy(Office.IRibbonControl control, ref bool cancelDefault)
        {
            bool isSuccess = IsSuccess();
            //如果cancelDefault返回false,则取消该操作
            cancelDefault = isSuccess;
        }

        /// <summary>
        /// 要处理的业务
        /// </summary>
        /// <returns></returns>
        private bool IsSuccess()
        {
            return false;
        }

4.Ribbon设计完毕,与外接程序关联:

 private Ribbon1 ribbon;//重新定义Ribbon1
        /// <summary>
        /// 重写RequestService方法
        /// </summary>
        /// <param name="serviceGuid"></param>
        /// <returns></returns>
        protected override object RequestService(Guid serviceGuid)
        {
            if (serviceGuid == typeof(Office.IRibbonExtensibility).GUID)
            {
                if (ribbon == null)
                    ribbon = new Ribbon1();
                return ribbon;
            }
            return base.RequestService(serviceGuid);
        }

5.可以复制一下,测试代码了。

支持(0) 反对(0) SanMaoSpace | 园豆:213 (菜鸟二级) | 2013-02-25 13:53

当然,没有白研究的技术,对于键盘钩子和鼠标钩子,也是基本的了解了,回头整理一篇博客出来。
一些参考:http://www.cnblogs.com/SanMaoSpace/archive/2013/02/20/2919337.html
其中对于键盘类型和鼠标类型的设定有错误,键盘应该为2,鼠标为7(好像以前是13和14)

public enum WH_Codes : int
        {
            //底层键盘钩子
            WH_KEYBOARD_LL = 2,//13

            //底层鼠标钩子
            WH_MOUSE_LL = 7, //14

            //nCode为0
            HC_ACTION=0
        }

回头整理一下。

支持(0) 反对(0) SanMaoSpace | 园豆:213 (菜鸟二级) | 2013-02-25 13:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册