如何在 Microsoft Office Word 中添加菜单项
How to Add a Menu Item in Microsoft Office Word
我尝试在 Microsoft Word 中创建一个基于 this post 的右键单击菜单项。
这是我的代码:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
try
{
eventHandler = new _CommandBarButtonEvents_ClickEventHandler(MyButton_Click);
Word.Application applicationObject = Globals.ThisAddIn.Application as Word.Application;
applicationObject.WindowBeforeRightClick += new Microsoft.Office.Interop.Word.ApplicationEvents4_WindowBeforeRightClickEventHandler(App_WindowBeforeRightClick);
}
catch (Exception exception)
{
MessageBox.Show("Error: " + exception.Message);
}
}
void App_WindowBeforeRightClick(Microsoft.Office.Interop.Word.Selection Sel, ref bool Cancel)
{
try
{
this.AddItem();
}
catch (Exception exception)
{
MessageBox.Show("Error: " + exception.Message);
}
}
private void AddItem()
{
Word.Application applicationObject = Globals.ThisAddIn.Application as Word.Application;
CommandBarButton commandBarButton = applicationObject.CommandBars.FindControl(MsoControlType.msoControlButton, missing, "HELLO_TAG", missing) as CommandBarButton;
if (commandBarButton != null)
{
System.Diagnostics.Debug.WriteLine("Found button, attaching handler");
commandBarButton.Click += eventHandler;
return;
}
CommandBar popupCommandBar = applicationObject.CommandBars["Text"];
bool isFound = false;
foreach (object _object in popupCommandBar.Controls)
{
CommandBarButton _commandBarButton = _object as CommandBarButton;
if (_commandBarButton == null) continue;
if (_commandBarButton.Tag.Equals("HELLO_TAG"))
{
isFound = true;
System.Diagnostics.Debug.WriteLine("Found existing button. Will attach a handler.");
commandBarButton.Click += eventHandler;
break;
}
}
if (!isFound)
{
commandBarButton = (CommandBarButton)popupCommandBar.Controls.Add(MsoControlType.msoControlButton, missing, missing, missing, true);
System.Diagnostics.Debug.WriteLine("Created new button, adding handler");
commandBarButton.Click += eventHandler;
commandBarButton.Caption = "h5";
commandBarButton.FaceId = 356;
commandBarButton.Tag = "HELLO_TAG";
commandBarButton.BeginGroup = true;
}
}
private void RemoveItem()
{
Word.Application applicationObject = Globals.ThisAddIn.Application as Word.Application;
CommandBar popupCommandBar = applicationObject.CommandBars["Text"];
foreach (object _object in popupCommandBar.Controls)
{
CommandBarButton commandBarButton = _object as CommandBarButton;
if (commandBarButton == null) continue;
if (commandBarButton.Tag.Equals("HELLO_TAG"))
{
popupCommandBar.Reset();
}
}
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
Word.Application App = Globals.ThisAddIn.Application as Word.Application;
App.WindowBeforeRightClick -= new Microsoft.Office.Interop.Word.ApplicationEvents4_WindowBeforeRightClickEventHandler(App_WindowBeforeRightClick);
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
//Event Handler for the button click
private void MyButton_Click(CommandBarButton cmdBarbutton, ref bool cancel)
{
System.Windows.Forms.MessageBox.Show("Hello !!! Happy Programming", "l19 !!!");
RemoveItem();
}
}
}
以及当我右键单击一个字母时的结果:
但是 table 我做不到。查看屏幕截图以了解我的意思:
当我右键单击 table 的 ms word 时,我无法添加项目菜单。请帮我。
谢谢!!
对不起我的英语,...
Word 维护不止一个上下文菜单。枚举Application.CommandBars
中位置为msoBarPopup
:
的所有CommandBar
个对象就可以看到全部
foreach (var commandBar in applicationObject.CommandBars.OfType<CommandBar>()
.Where(cb => cb.Position == MsoBarPosition.msoBarPopup))
{
Debug.WriteLine(commandBar.Name);
}
链接示例中使用的命令栏名为 "Text",该命令栏与右键单击段落文本中某处时弹出的上下文菜单有关。
但是,要向 table 的上下文菜单添加内容,您必须将按钮添加到适当的 table 相关上下文菜单。表格有不同的上下文菜单,具体取决于您单击时选择的内容:
- applicationObject.CommandBars["Tables"]
- applicationObject.CommandBars["Table Text"]
- applicationObject.CommandBars["Table Cells"]
- applicationObject.CommandBars["Table Headings"]
- applicationObject.CommandBars["Table Lists"]
- applicationObject.CommandBars["Table Pictures"]
所以我建议您提取一个方法,将按钮添加到 CommandBar
,然后使用要添加按钮的所有命令栏调用该方法。类似于以下内容:
private void AddButton(CommandBar popupCommandBar)
{
bool isFound = false;
foreach (var commandBarButton in popupCommandBar.Controls.OfType<CommandBarButton>())
{
if (commandBarButton.Tag.Equals("HELLO_TAG"))
{
isFound = true;
Debug.WriteLine("Found existing button. Will attach a handler.");
commandBarButton.Click += eventHandler;
break;
}
}
if (!isFound)
{
var commandBarButton = (CommandBarButton)popupCommandBar.Controls.Add
(MsoControlType.msoControlButton, missing, missing, missing, true);
Debug.WriteLine("Created new button, adding handler");
commandBarButton.Click += eventHandler;
commandBarButton.Caption = "Hello !!!";
commandBarButton.FaceId = 356;
commandBarButton.Tag = "HELLO_TAG";
commandBarButton.BeginGroup = true;
}
}
// add the button to the context menus that you need to support
AddButton(applicationObject.CommandBars["Text"]);
AddButton(applicationObject.CommandBars["Table Text"]);
AddButton(applicationObject.CommandBars["Table Cells"]);
正如德克指出的那样,您需要单击原始问题下的编辑 link,将信息粘贴到您的 "answer" 末尾,然后删除 "answer" -这不是答案...
我的回答基于您提供的附加信息。这显然是一个 VSTO 应用程序级加载项。因此,对于 Office 2013,您需要使用 Ribbon XML 创建自定义菜单。使用 Ribbon Designer 无法做到这一点,因此如果您已经拥有 Ribbon Designer,则需要将其转换为 Ribbon XML。您将在 VSTO 文档中找到有关如何执行此操作的文章:
https://msdn.microsoft.com/en-us/library/aa942866.aspx
有关如何使用功能区 XML 自定义上下文菜单的信息,请参阅这篇 MSDN 文章:
https://msdn.microsoft.com/en-us/library/ee691832(v=office.14)
总而言之:您需要向功能区添加一个 元素 XML,并为每个要添加或更改的菜单项添加一个 元素。元素的 idMso 属性指定了哪个上下文菜单。您可以在 Microsoft 站点的下载中找到 ControlIds(idMso 的值)的列表:
https://www.microsoft.com/en-us/download/details.aspx?id=36798
FWIW 该上下文菜单的 ControlId 可能是 ContextMenuTextTable。
好的,终于修复成功了
首先,RightClick 有 200 多个不同的上下文菜单
但是word.application.CommandBars的普通类型是基于under Indexes
{ 105, 120, 127, 117, 108, 99, 134 };
这些包含文本、table、标题、文本框和...
的索引
因此,您必须通过 foreach 更新代码以迭代创建新的 commandBarButtons
在每种类型的 ContextMenu 上
像在代码下的东西在你的启动函数上使用这个
try
{
List<int> mindex = new List<int>() { 105, 120, 127, 117, 108, 99, 134 };
foreach (var item in mindex)
{
AddItemGeneral(applicationObject.CommandBars[item], youreventHandler, "yourTagLabelplusaDiffNumber" + item.ToString(), "your Caption");
}
}
catch (Exception exception)
{
MessageBox.Show("Error: " + exception.Message);
}
最后,
private void AddItemGeneral(CommandBar popupCommandBar, _CommandBarButtonEvents_ClickEventHandler MyEvent, string MyTag,string MyCaption)
{
CommandBarButton commandBarButton = popupCommandBar.CommandBars.FindControl(MsoControlType.msoControlButton, missing, MyTag, missing) as CommandBarButton;
if (commandBarButton == null)
{
commandBarButton = (CommandBarButton)popupCommandBar.Controls.Add(MsoControlType.msoControlButton, Missing.Value, Missing.Value, popupCommandBar.Controls.Count + 1, true);
commandBarButton.Caption = MyCaption;
commandBarButton.BeginGroup = true;
commandBarButton.Tag = MyTag;
commandBarButton.Click += MyEvent;
}
else
{
commandBarButton.Click += MyEvent;
}
}
希望对大家有所帮助。 ;->
我尝试在 Microsoft Word 中创建一个基于 this post 的右键单击菜单项。
这是我的代码:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
try
{
eventHandler = new _CommandBarButtonEvents_ClickEventHandler(MyButton_Click);
Word.Application applicationObject = Globals.ThisAddIn.Application as Word.Application;
applicationObject.WindowBeforeRightClick += new Microsoft.Office.Interop.Word.ApplicationEvents4_WindowBeforeRightClickEventHandler(App_WindowBeforeRightClick);
}
catch (Exception exception)
{
MessageBox.Show("Error: " + exception.Message);
}
}
void App_WindowBeforeRightClick(Microsoft.Office.Interop.Word.Selection Sel, ref bool Cancel)
{
try
{
this.AddItem();
}
catch (Exception exception)
{
MessageBox.Show("Error: " + exception.Message);
}
}
private void AddItem()
{
Word.Application applicationObject = Globals.ThisAddIn.Application as Word.Application;
CommandBarButton commandBarButton = applicationObject.CommandBars.FindControl(MsoControlType.msoControlButton, missing, "HELLO_TAG", missing) as CommandBarButton;
if (commandBarButton != null)
{
System.Diagnostics.Debug.WriteLine("Found button, attaching handler");
commandBarButton.Click += eventHandler;
return;
}
CommandBar popupCommandBar = applicationObject.CommandBars["Text"];
bool isFound = false;
foreach (object _object in popupCommandBar.Controls)
{
CommandBarButton _commandBarButton = _object as CommandBarButton;
if (_commandBarButton == null) continue;
if (_commandBarButton.Tag.Equals("HELLO_TAG"))
{
isFound = true;
System.Diagnostics.Debug.WriteLine("Found existing button. Will attach a handler.");
commandBarButton.Click += eventHandler;
break;
}
}
if (!isFound)
{
commandBarButton = (CommandBarButton)popupCommandBar.Controls.Add(MsoControlType.msoControlButton, missing, missing, missing, true);
System.Diagnostics.Debug.WriteLine("Created new button, adding handler");
commandBarButton.Click += eventHandler;
commandBarButton.Caption = "h5";
commandBarButton.FaceId = 356;
commandBarButton.Tag = "HELLO_TAG";
commandBarButton.BeginGroup = true;
}
}
private void RemoveItem()
{
Word.Application applicationObject = Globals.ThisAddIn.Application as Word.Application;
CommandBar popupCommandBar = applicationObject.CommandBars["Text"];
foreach (object _object in popupCommandBar.Controls)
{
CommandBarButton commandBarButton = _object as CommandBarButton;
if (commandBarButton == null) continue;
if (commandBarButton.Tag.Equals("HELLO_TAG"))
{
popupCommandBar.Reset();
}
}
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
Word.Application App = Globals.ThisAddIn.Application as Word.Application;
App.WindowBeforeRightClick -= new Microsoft.Office.Interop.Word.ApplicationEvents4_WindowBeforeRightClickEventHandler(App_WindowBeforeRightClick);
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
//Event Handler for the button click
private void MyButton_Click(CommandBarButton cmdBarbutton, ref bool cancel)
{
System.Windows.Forms.MessageBox.Show("Hello !!! Happy Programming", "l19 !!!");
RemoveItem();
}
}
}
以及当我右键单击一个字母时的结果:
但是 table 我做不到。查看屏幕截图以了解我的意思:
当我右键单击 table 的 ms word 时,我无法添加项目菜单。请帮我。 谢谢!!
对不起我的英语,...
Word 维护不止一个上下文菜单。枚举Application.CommandBars
中位置为msoBarPopup
:
CommandBar
个对象就可以看到全部
foreach (var commandBar in applicationObject.CommandBars.OfType<CommandBar>()
.Where(cb => cb.Position == MsoBarPosition.msoBarPopup))
{
Debug.WriteLine(commandBar.Name);
}
链接示例中使用的命令栏名为 "Text",该命令栏与右键单击段落文本中某处时弹出的上下文菜单有关。
但是,要向 table 的上下文菜单添加内容,您必须将按钮添加到适当的 table 相关上下文菜单。表格有不同的上下文菜单,具体取决于您单击时选择的内容:
- applicationObject.CommandBars["Tables"]
- applicationObject.CommandBars["Table Text"]
- applicationObject.CommandBars["Table Cells"]
- applicationObject.CommandBars["Table Headings"]
- applicationObject.CommandBars["Table Lists"]
- applicationObject.CommandBars["Table Pictures"]
所以我建议您提取一个方法,将按钮添加到 CommandBar
,然后使用要添加按钮的所有命令栏调用该方法。类似于以下内容:
private void AddButton(CommandBar popupCommandBar)
{
bool isFound = false;
foreach (var commandBarButton in popupCommandBar.Controls.OfType<CommandBarButton>())
{
if (commandBarButton.Tag.Equals("HELLO_TAG"))
{
isFound = true;
Debug.WriteLine("Found existing button. Will attach a handler.");
commandBarButton.Click += eventHandler;
break;
}
}
if (!isFound)
{
var commandBarButton = (CommandBarButton)popupCommandBar.Controls.Add
(MsoControlType.msoControlButton, missing, missing, missing, true);
Debug.WriteLine("Created new button, adding handler");
commandBarButton.Click += eventHandler;
commandBarButton.Caption = "Hello !!!";
commandBarButton.FaceId = 356;
commandBarButton.Tag = "HELLO_TAG";
commandBarButton.BeginGroup = true;
}
}
// add the button to the context menus that you need to support
AddButton(applicationObject.CommandBars["Text"]);
AddButton(applicationObject.CommandBars["Table Text"]);
AddButton(applicationObject.CommandBars["Table Cells"]);
正如德克指出的那样,您需要单击原始问题下的编辑 link,将信息粘贴到您的 "answer" 末尾,然后删除 "answer" -这不是答案...
我的回答基于您提供的附加信息。这显然是一个 VSTO 应用程序级加载项。因此,对于 Office 2013,您需要使用 Ribbon XML 创建自定义菜单。使用 Ribbon Designer 无法做到这一点,因此如果您已经拥有 Ribbon Designer,则需要将其转换为 Ribbon XML。您将在 VSTO 文档中找到有关如何执行此操作的文章: https://msdn.microsoft.com/en-us/library/aa942866.aspx
有关如何使用功能区 XML 自定义上下文菜单的信息,请参阅这篇 MSDN 文章: https://msdn.microsoft.com/en-us/library/ee691832(v=office.14)
总而言之:您需要向功能区添加一个
FWIW 该上下文菜单的 ControlId 可能是 ContextMenuTextTable。
好的,终于修复成功了
首先,RightClick 有 200 多个不同的上下文菜单
但是word.application.CommandBars的普通类型是基于under Indexes { 105, 120, 127, 117, 108, 99, 134 }; 这些包含文本、table、标题、文本框和...
的索引因此,您必须通过 foreach 更新代码以迭代创建新的 commandBarButtons 在每种类型的 ContextMenu 上 像在代码下的东西在你的启动函数上使用这个
try
{
List<int> mindex = new List<int>() { 105, 120, 127, 117, 108, 99, 134 };
foreach (var item in mindex)
{
AddItemGeneral(applicationObject.CommandBars[item], youreventHandler, "yourTagLabelplusaDiffNumber" + item.ToString(), "your Caption");
}
}
catch (Exception exception)
{
MessageBox.Show("Error: " + exception.Message);
}
最后,
private void AddItemGeneral(CommandBar popupCommandBar, _CommandBarButtonEvents_ClickEventHandler MyEvent, string MyTag,string MyCaption)
{
CommandBarButton commandBarButton = popupCommandBar.CommandBars.FindControl(MsoControlType.msoControlButton, missing, MyTag, missing) as CommandBarButton;
if (commandBarButton == null)
{
commandBarButton = (CommandBarButton)popupCommandBar.Controls.Add(MsoControlType.msoControlButton, Missing.Value, Missing.Value, popupCommandBar.Controls.Count + 1, true);
commandBarButton.Caption = MyCaption;
commandBarButton.BeginGroup = true;
commandBarButton.Tag = MyTag;
commandBarButton.Click += MyEvent;
}
else
{
commandBarButton.Click += MyEvent;
}
}
希望对大家有所帮助。 ;->