C# 与ClipBoard交互操作OLE对象-初探

公司的一款绘图软件希望可以与Word进行交互,将绘制的对象可以拷贝到word,且在word内双击可以调用程序进行编辑,类似于viso绘制流程。

经过尝试,C#程序可以生成一个Ole对象,并将对象保存到剪贴板。剪贴板的内容粘贴到Word后会生成一个Ole对象,该对象可以被Word识别,双击该对象,会尝试打开C#程序。

C#程序

  1. 新建一个OLEObject类继承IOLEObject, IDataObject, IPersistStorage and IViewObject

    1. OLEObject对象重载Draw方法,当尝试粘贴对象到Word时,会调用该方法,进行绘制。理论上这里可以绘制结构式图片到word,而结构式数据在对象内部。

    2. public override void Draw(Graphics g)
              {
                  g.DrawRectangle(System.Drawing.Pens.Black, 0, 0, 300, 300);
                  g.DrawString(DateTime.Now.ToShortTimeString(), _Font, Brushes.Green, new RectangleF(0, 0, 300, 300));
              }
      
  2. 新建一个DataObject继承IDataObject,这个对象负责数据构建,并将数据赋值到ClipBoard

  3. DataObject对象至少要包含数据类型"Object Descriptor", "Embed Source" and "MetaFilePict",这样粘贴到word时,才能被识别OLE对象

  4. github有示例程序,地址https://github.com/acaly/SharpOle

注册类库到注册表

此时粘贴到word的OLE对象还无法被系统识别,word并不知道应该调用什么程序来对这个对象进行处理。需要把注册信息写入注册表

  1. 将类库dll注册到COM组件库,可以参考https://limbioliong.wordpress.com/2011/08/30/creating-a-com-server-using-c/
  2. 这里我注册是用的是C:\Windows\Microsoft.NET\Framework\v4.0.30319\REGASM.EXE SharpOle.dll /tlb
  3. 注册后Word文档中的Ole对象会被识别,双击对象时会尝试调用SharpOleTest.exe(Demo程序)编辑

参考文档

https://limbioliong.wordpress.com/2011/08/30/creating-a-com-server-using-c/ 注册类库为COM组件

https://stackoverflow.com/questions/40901712/how-to-implement-ole-server-in-c-sharp 如何实现C#版的OLE服务

https://learn.microsoft.com/en-us/cpp/mfc/data-objects-and-data-sources-creation-and-destruction?view=msvc-170 剪贴板的操作对象

https://learn.microsoft.com/en-us/cpp/mfc/clipboard-using-the-ole-clipboard-mechanism?view=msvc-170 剪贴板与OLE机制

https://www.nirsoft.net/utils/inside_clipboard.html 抓包剪贴板内容的工具

posted @ 2023-02-09 13:52  东方未  阅读(403)  评论(0)    收藏  举报