相对微软office的PPT的复制操作,进行判断处理,对于选中的对象,可以在复制后控制该对象的一些属性、方法,是不是在VS2010中提供了可以调用的事件方法,可以获得这个对象。(也可以理解为禁用PPT的复制操作)
网上的资料,大家对于VSTO开发的,大多是对于Word\Excel\Outlook的,还有一些是使用VB语言写的,但对于PPT的相关操作和示例代码不是很多,有点难度。谁做过类似的开发,碰到过相关的问题,希望能给些建议。
在PPT中控制复制、剪切、粘贴,有几种思路可供提供:(主要右键菜单、快捷键、工具栏的复制、剪切、粘贴)
1.对于快捷键使用键盘钩子控制,对于右键菜单可以使用鼠标钩子控制,对于工具栏的需要命名按钮来控制;
2.可以可以控制微软的系统剪切板和Ofiice剪切板,进行数据的即使清空。Clip.Clear()。
目前还未解决彻底,给个思路。问题链接:http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/b579fa87-8ed9-4982-8b9e-e4c06246841c
似乎问题没有这么复制,是我把问题想复杂了。
对于剪切、复制、粘贴,微软都已经通过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.可以复制一下,测试代码了。
当然,没有白研究的技术,对于键盘钩子和鼠标钩子,也是基本的了解了,回头整理一篇博客出来。
一些参考: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 }
回头整理一下。