VisualStudio如何进行OneNote插件开发?

article/2025/9/29 23:59:33

文章目录

  • 0.引言
  • 1.工具和数据准备
  • 2.创建工程
  • 3.创建ribbon配置文件
  • 4.编写功能代码
  • 5.安装和部署
  • 6.OneNote插件展示

0.引言

  在OneNote做笔记很方便,但笔者用久后,就觉得OneNote缺少自己想要的一些功能,希望通过二次开发实现不断增长的需求。起初对OneNote二次开发是利用Onetastic通过宏实现较为简单的二次开发,但用久后,还是不满足日益增长的需求。偶然在网上找到一篇关于利用VisualStudio进行OneNote二次开发的文章[2],本文以笔者的电脑系统环境重现了该文章的方法,并补充了该文章开发过程中不详细的内容,得到了想要的二次开发的结果。

1.工具和数据准备

  (1)工具准备;
  本文使用VisualStudio2015(VS2015)进行OneNote2016的插件开发,VS2015没有自带的安装和部署工具,需要自行安装部署软件:Microsoft Visual Studio 2015 Installer Projects(下载地址: https://marketplace.visualstudio.com/items?itemName=visualstudioclient.MicrosoftVisualStudio2015InstallerProjects)。
  (2)数据准备。
  本文涉及一张用于插件显示的图片(HelloOneNote.png),如下所示:
  在这里插入图片描述

2.创建工程

  (1)创建类库;
  在这里插入图片描述
  (2)勾选使程序集COM可见;
  在这里插入图片描述
  (3)勾选为COM互操作注册。
  在这里插入图片描述

3.创建ribbon配置文件

  (1)添加ribbon.xml文件;
  在这里插入图片描述
  (2)将配置文件存入工程资源;
  在这里插入图片描述
  (3) 打开ribbon.xml文件,编写配置文件代码。
  在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" loadImage="GetImage"><ribbon><tabs><tab id="tabCustom" label="Custom"><group id="groupHello" label="Hello"><button id="buttonHello" label="HelloOneNote" size="large" screentip="Press this for a 'Hello World!' message" onAction="showHello" image="HelloOneNote.png" /></group></tab></tabs></ribbon>
</customUI>

4.编写功能代码

  (1)为工程添加引用:Extensibility、office、Microsoft OneNote 15.0 Object Library、System.Windows.Forms和System.Drawing;
  在这里插入图片描述
  详细添加步骤:
  在这里插入图片描述
  ①添加Extensibility;
  在这里插入图片描述
  ②添加office;
  在这里插入图片描述
  ③添加Microsoft OneNote 15.0 Object Library;
  在这里插入图片描述
  ④添加System.Windows.Forms;
  在这里插入图片描述
  ⑤添加System.Drawing。
  在这里插入图片描述
  (2)在Class1中添加using;

using System;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Windows.Forms;
using System.Xml.Linq;
using Extensibility;
using Microsoft.Office.Core;
using OneNote = Microsoft.Office.Interop.OneNote;

  (3)创建GUID;
  在这里插入图片描述
  本文GUID:{AD9144B5-6B8F-4C5D-8B5C-3A5E5C1C0FA1}
  (4)在Class1上添加标记,并继承接口;
  在这里插入图片描述

[Guid("AD9144B5-6B8F-4C5D-8B5C-3A5E5C1C0FA1"), ProgId("HelloOneNote.Class1")]
public class Class1 : IDTExtensibility2, IRibbonExtensibility
{}

  (5)在Class1中添加以下方法(实现接口IDTExtensibility2、实现接口IRibbonExtensibility);
  在这里插入图片描述

private OneNote.Application onApp = new OneNote.Application();
private object application;
public void OnConnection(object Application, ext_ConnectMode ConnectMode, object AddInInst, ref Array custom)
{application = Application;
}
public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom)
{application = null;GC.Collect();GC.WaitForPendingFinalizers();
}
public void OnAddInsUpdate(ref Array custom) { }
public void OnStartupComplete(ref Array custom) { }
public void OnBeginShutdown(ref Array custom)
{if (application != null){application = null;}
}
public string GetCustomUI(string RibbonID)
{return Properties.Resources.ribbon;
}

  注:以上属性和方法内容一般不用更改。
  (6)在Class1中添加以下方法(实现ribbon.xml中按钮的onAction事件调用的函数);
  在这里插入图片描述

public void showHello(IRibbonControl control)
{var app = application as OneNote.Application;var win = app.Windows;string id = (application as OneNote.Application).Windows.CurrentWindow.CurrentPageId;string title;app.GetPageContent(id, out title);var doc = XDocument.Parse(title);string pageTitle = doc.Descendants().FirstOrDefault().Attribute("ID").NextAttribute.Value;MessageBox.Show("Current Page ID = " + pageTitle, "Hello OneNote,I am cacrle.");
}

  (7)添加按钮图片。
  ①将HelloOneNote.png图片拖进资源中;
  在这里插入图片描述
  ②在Class1中添加以下方法(实现ribbon.xml中加载图片的函数)。
  在这里插入图片描述

public IStream GetImage(string imageName)
{MemoryStream mem = new MemoryStream();Properties.Resources.HelloOneNote.Save(mem, ImageFormat.Png);return new CCOMStreamWrapper(mem);
}class CCOMStreamWrapper : IStream
{public CCOMStreamWrapper(System.IO.Stream streamWrap){m_stream = streamWrap;}public void Clone(out IStream ppstm){ppstm = new CCOMStreamWrapper(m_stream);}public void Commit(int grfCommitFlags){m_stream.Flush();}public void CopyTo(IStream pstm, long cb, IntPtr pcbRead, IntPtr pcbWritten){}public void LockRegion(long libOffset, long cb, int dwLockType){throw new System.NotImplementedException();}public void Read(byte[] pv, int cb, IntPtr pcbRead){Marshal.WriteInt64(pcbRead, m_stream.Read(pv, 0, cb));}public void Revert(){throw new System.NotImplementedException();}public void Seek(long dlibMove, int dwOrigin, IntPtr plibNewPosition){long posMoveTo = 0;Marshal.WriteInt64(plibNewPosition, m_stream.Position);switch (dwOrigin){case 0:{/* STREAM_SEEK_SET */posMoveTo = dlibMove;}break;case 1:{/* STREAM_SEEK_CUR */posMoveTo = m_stream.Position + dlibMove;}break;case 2:{/* STREAM_SEEK_END */posMoveTo = m_stream.Length + dlibMove;}break;default:return;}if (posMoveTo >= 0 && posMoveTo < m_stream.Length){m_stream.Position = posMoveTo;Marshal.WriteInt64(plibNewPosition, m_stream.Position);}}public void SetSize(long libNewSize){m_stream.SetLength(libNewSize);}public void Stat(out System.Runtime.InteropServices.ComTypes.STATSTG pstatstg, int grfStatFlag){pstatstg = new System.Runtime.InteropServices.ComTypes.STATSTG();pstatstg.cbSize = m_stream.Length;if ((grfStatFlag & 0x0001/* STATFLAG_NONAME */) != 0)return;pstatstg.pwcsName = m_stream.ToString();}public void UnlockRegion(long libOffset, long cb, int dwLockType){throw new System.NotImplementedException();}public void Write(byte[] pv, int cb, IntPtr pcbWritten){Marshal.WriteInt64(pcbWritten, 0);m_stream.Write(pv, 0, cb);Marshal.WriteInt64(pcbWritten, cb);}private System.IO.Stream m_stream;
}

5.安装和部署

  (1)在解决方案中添加安装和部署的项目;
  在这里插入图片描述
  (2)修改注册表;
  在这里插入图片描述
  ①HKEY_CLASSES_ROOT→AppID→{工程的GUID}:新建字符串值,Name:DllSurogate,Value为空;
  在这里插入图片描述
  ②HKEY_CLASSES_ROOT→CLSID→{工程的GUID}:新建字符串值,Name:AppID,Value:{工程的GUID};
  在这里插入图片描述
  ③HKEY_CURRENT_USER→Software→Microsoft→Office→OneNote→AddIns→工程的ProgId;
  工程的ProgId,一般为“命名空间.类名"(本为HelloOneNote.Class1)
  添加3个键:
  字符串值:Name:Description,Value:自定义的工程描述
  字符串值:Name:FriendlyName,Value:自定义的工程名称(本文为ShowFirstOneNotePlugin)
  DWORD值:Name:LoadBehavior,Value:3
  在这里插入图片描述
  ④HKEY_LOCAL_MACHINE→Software→Classes→AppID→{工程的GUID}:新建字符串值,Name:DllSurrogate,Value为空;
  在这里插入图片描述
  ⑤ HKEY_LOCAL_MACHINE→Software→Classes→CLSID→{工程的GUID}:新建字符串值,Name:AppID,Value:{工程的GUID}。
  在这里插入图片描述
  (3)设置项目输出;
  在这里插入图片描述
  (4)生成解决方案;
  在这里插入图片描述
  (5)安装。
  ①通过VS安装;
  在这里插入图片描述
  ②通过安装文件安装(可共享该文件)。
  在这里插入图片描述
  注:安装过程一般保持默认参数,一直下一步即可。

6.OneNote插件展示

  在这里插入图片描述

参考资料:
[1] cacrle. VisualStudio如何进行桌面软件开发?; 2023-03-18 [accessed 2023-04-06].
[2] johnhuang. 创建属于自己的OneNote插件; 2017-01-20 [accessed 2023-04-06].
[3] 微软官网. How to develop an OneNote 2010 ribbon add-in application; [accessed 2023-04-06].
[4] 微软官网. Deploying a Visual Studio 2010 Tools for Office Solution Using; [accessed 2023-04-06].


http://chatgpt.dhexx.cn/article/uu65nAJJ.shtml

相关文章

如何卸载Onetastic

Looking for an effective solution to uninstall Onetastic (64-Bit)? Download professional uninstaller to get rid of it now! Download Onetastic (64-Bit) Removal Tool Tested Malware & Virus Free by McAfee™ Failed to uninstall Onetastic (64-Bit) through …

onenote运用onetastic和notehighlight插件

一、两个免费插件 插件1&#xff1a;onetastic 查件2&#xff1a;notehighlight 或(github) 其中onetastic可以添加宏(自定义或下载宏)&#xff0c;便于快捷操作。如改变文本字体和字体大小、插入时间、横线、快速查找、替换等。notehighlight可以添加代码样式、主题(noteh…

VUE上传大文件的三种解决方案

最近遇见一个需要上传超大大文件的需求&#xff0c;调研了七牛和腾讯云的切片分段上传功能&#xff0c;因此在此整理前端大文件上传相关功能的实现。 在某些业务中&#xff0c;大文件上传是一个比较重要的交互场景&#xff0c;如上传入库比较大的Excel表格数据、上传影音文件等…

大文件怎样实现快速上传?

前言 大文件快速上传的方案&#xff0c;相信你也有过了解&#xff0c;其实无非就是将 文件变小&#xff0c;也就是通过 压缩文件资源 或者 文件资源分块 后再上传。 本文只介绍资源分块上传的方式&#xff0c;并且会通过 前端&#xff08;vue3 vite&#xff09; 和 服务端&…

大文件夹上传

目前没有这样的标准&#xff0c;可以把文件夹打包上传大文件。 webkitdirectory Booleanwebkitdirectory属性&#xff08;如果存在&#xff09;指示用户在文件选择器界面中只能选择目录。有关HTMLInputElement.webkitdirectory其他详细信息和示例&#xff0c;请参阅。 虽然最初…

往GitHub上传大文件

1.下载Git Git - Downloads 2.下载GitLFS https://git-lfs.github.com/ 3.复制URL 4.在本地创建文件夹&#xff0c;右键Git Bash Here 5.粘贴URL进行下载--下载到本地 git clone URL 6.转到克隆到本地的文件夹内&#xff0c;运行git lfs track--进行文件定位 若要查找所有…

上传大文件的解决方案

上传大文件的解决方案 需求&#xff1a;项目要支持大文件上传功能&#xff0c;经过讨论&#xff0c;初步将文件上传大小控制在500M内&#xff0c;因此自己需要在项目中进行文件上传部分的调整和配置&#xff0c;自己将大小都以501M来进行限制。 第一步&#xff1a; 前端修改 由…

大文件上传解决方案

之前仿造uploadify写了一个HTML5版的文件上传插件&#xff0c;没看过的朋友可以点此先看一下~得到了不少朋友的好评&#xff0c;我自己也用在了项目中&#xff0c;不论是用户头像上传&#xff0c;还是各种媒体文件的上传&#xff0c;以及各种个性的业务需求&#xff0c;都能得到…

GitHub上传大文件(100MB以上)

GitHub上传大文件(100MB以上) Github桌面端和网站上都无法直接上传大于100MB的文件&#xff0c;此时就要借助 GitLFS才能实现大文件的上传。 文章目录 GitHub上传大文件(100MB以上)准备工作上传 准备工作 将GitLFS安装到Git的bin文件夹下 GitLFS下载链接&#xff1a;https:/…

大文件如何快速上传

之前仿造uploadify写了一个HTML5版的文件上传插件&#xff0c;没看过的朋友可以点此先看一下~得到了不少朋友的好评&#xff0c;我自己也用在了项目中&#xff0c;不论是用户头像上传&#xff0c;还是各种媒体文件的上传&#xff0c;以及各种个性的业务需求&#xff0c;都能得到…

如何在GitHub上传大文件(≥100M)

学习工作中&#xff0c;有时会遇到需要将一些资源上传到GitHub的仓库&#xff08;repository&#xff09;上去&#xff0c;比如一些训练完的模型。但GitHub对于直接上传的文件有大小限制&#xff0c;超过100M的文件需要使用Git LFS才能上传。以下是我根据各位大神和自己的实操经…

大文件上传+解决方案

一、 功能性需求与非功能性需求 要求操作便利&#xff0c;一次选择多个文件和文件夹进行上传&#xff1b; 支持PC端全平台操作系统&#xff0c;Windows,Linux,Mac 支持文件和文件夹的批量下载&#xff0c;断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。 支持文件…

前端上传大文件的解决方案

最近遇见一个需要上传超大大文件的需求&#xff0c;调研了七牛和腾讯云的切片分段上传功能&#xff0c;因此在此整理前端大文件上传相关功能的实现。 在某些业务中&#xff0c;大文件上传是一个比较重要的交互场景&#xff0c;如上传入库比较大的Excel表格数据、上传影音文件等…

JAVA上传大文件的三种解决方案

我们平时经常做的是上传文件&#xff0c;上传文件夹与上传文件类似&#xff0c;但也有一些不同之处&#xff0c;这次做了上传文件夹就记录下以备后用。 首先我们需要了解的是上传文件三要素&#xff1a; 1.表单提交方式:post (get方式提交有大小限制,post没有) 2.表单的enct…

大文件如何快速上传?

前言 大文件快速上传的方案&#xff0c;相信你也有过了解&#xff0c;其实无非就是将 文件变小&#xff0c;也就是通过 压缩文件资源或者 文件资源分块 后再上传。 本文只介绍资源分块上传的方式&#xff0c;并且会通过 前端&#xff08;vue3 vite&#xff09; 和 服务端&…

Java如何上传大文件

1 背景 用户本地有一份txt或者csv文件&#xff0c;无论是从业务数据库导出、还是其他途径获取&#xff0c;当需要使用蚂蚁的大数据分析工具进行数据加工、挖掘和共创应用的时候&#xff0c;首先要将本地文件上传至ODPS&#xff0c;普通的小文件通过浏览器上传至服务器&#xf…

Github上传大文件(>25MB)教程

Github上传大文件&#xff08;>25MB&#xff09;教程 Github上传大文件&#xff08;>25MB&#xff09;教程安装git安装Git Large File Storage实例踩坑点1&#xff1a;failed to push some refs to踩坑点2&#xff1a;main与master踩坑点3&#xff1a;Failed to connect …

如何高效的上传大文件?

业务场景&#xff1a;在很多业务中会涉及到文件上传&#xff0c;对于上传的文件大小要求也相对比较广&#xff0c;对于小文件而言我们使用MultipartFile上传就能解决&#xff0c;对于大文件来说可能也就将文件拆分成多份&#xff0c;一份一份的上传&#xff0c;大部分业务是足以…

请问:怎么实现大文件快速上传?

关注公众号 前端开发博客&#xff0c;领27本电子书 回复加群&#xff0c;自助秒进前端群 前言 大文件快速上传的方案&#xff0c;相信你也有过了解&#xff0c;其实无非就是将 文件变小&#xff0c;也就是通过 压缩文件资源 或者 文件资源分块 后再上传。 本文只介绍资源分块上…

超大文件上传解决方案

一、 功能性需求与非功能性需求 要求操作便利&#xff0c;一次选择多个文件和文件夹进行上传&#xff1b; 支持PC端全平台操作系统&#xff0c;Windows,Linux,Mac 支持文件和文件夹的批量下载&#xff0c;断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。 支持文件…