我正在尝试为SSMS 2008和/或2008 R2创建一个加载项,但我马上就遇到了问题.
我可以让我的加载项工作,并在SSMS启动时让它只显示一个消息框.
但是,在下载各种代码示例后,在尝试引用Microsoft.SqlServer.Management.UI.VSIntegration.ServiceCache时,我得到一个空引用异常:
Commands2 commands = (Commands2)ServiceCache.ExtensibilityModel.Commands;
Run Code Online (Sandbox Code Playgroud)
我在使用SSMS 2008或SSMS 2008 R2时遇到此问题.我正在研究Visual Studio 2010.
这有点令人沮丧,因为我渴望了解更多有关SSMS加载项的知识,但似乎无法通过那里的少量样本.
任何建议/提示赞赏.
谢谢
我需要在 Visio 窗口中使用一组按钮创建自己的工具栏。下一个代码生成工具栏(有效),创建按钮(有效),并为它们分配 Click 事件处理程序。
vsoCommandBar = vsoCommandBars.Add("MyCommandBat", Office.MsoBarPosition.msoBarTop, false, true);
var vsoButtonX1 = (Office.CommandBarButton)vsoCommandBar.Controls.Add(
Office.MsoControlType.msoControlButton, 1, 2, 1, false);
vsoButtonX1.Caption = "Test1";
vsoButtonX1.Tag = "";
vsoButtonX1.Click += GlobalEvents.btnTestClick;
var vsoButtonX2 = (Office.CommandBarButton)vsoCommandBar.Controls.Add(
Office.MsoControlType.msoControlButton, 1, 2, 2, false);
vsoButtonX2.Caption = "Test2";
vsoButtonX2.Tag = "";
vsoButtonX2.Click += GlobalEvents.btnTest2Click;
Run Code Online (Sandbox Code Playgroud)
处理程序很简单,但不同(当然)。
public void btnTestClick(Office.CommandBarButton vsoButton, ref bool cancelDefault)
{
MessageBox.Show("btnTestClick!");
}
public void btnTest2Click(Office.CommandBarButton vsoButton, ref bool cancelDefault)
{
MessageBox.Show("btnTest2Click!");
}
Run Code Online (Sandbox Code Playgroud)
当我单击任何按钮时,我会看到带有“btnTestClick!”的对话框。并在按下带有“btnTest2Click!”的“确定”对话框后。在两个按钮中的任何一个上。
此外,如果我跳过这一行:
vsoButtonX2.Click += GlobalEvents.btnTest2Click;
Run Code Online (Sandbox Code Playgroud)
我会看到单个对话框“btnTestClick!” 在任何按钮上。
至少对于命令栏,它似乎只有一个单击处理器。是真的吗?!
PS:当然,我可以使用“vsoButton”参数和标签来检测按钮被按下,但使用不同的事件处理程序似乎更方便......这可能吗?
我有一个使用 VSTO 和互操作的 Microsoft Word 插件。如果DocumentOpen为已经打开的文档触发事件,我的代码就会出现问题。我已经能够通过打开文档 doc1、打开另一个文档 doc2,然后再次尝试打开 doc1 来一致地复制这一点。
Doc1 显然已经打开,但再次为 doc1 触发 DocumentOpen 事件。这是一个预期的设计,如果是,是否有一种简单的方法可以判断是否正在为已打开的文档触发事件?
private void ThisAddIn_Startup(object sender, System.EventArgs a)
{
try
{
this.Application.DocumentOpen +=
new MSWord.ApplicationEvents4_DocumentOpenEventHandler(Application_DocumentOpen);
}
}
private void Application_DocumentOpen(MSWord.Document document)
{
HandleOpenedDocument(document);
}
Run Code Online (Sandbox Code Playgroud) 我想检查插件是否已安装并被引用。下面的代码检查插件是否安装。我如何检查它是否在 excel 中被引用。
引用我的意思是工具> 插件> 插件对话框> 如果插件已安装> 检查是否选中了具有特定名称的插件。
我希望最好没有任何循环。
Sub Demo()
Dim b As Boolean
b = CheckAddin("Solver add-in")
MsgBox "Solver is " & IIf(b, "", "not ") & "installed"
End Sub
Function CheckAddin(s As String) As Boolean
Dim x As Variant
On Error Resume Next
x = AddIns(s).Installed
On Error Goto 0
If IsEmpty(x) Then
CheckAddin = False
Else
CheckAddin = True
End If
End Function
Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能检测到用户何时单击了Excel中的页眉/页脚按钮,这样我就可以在我的加载项选项卡上显示一些自定义页眉/页脚相关的功能区控件,并在用户不在页眉中时隐藏它们/页脚编辑模式.
是否有可能以某种方式劫持此按钮?我见过应用程序劫持了Excel Save.我正在寻找与页眉/页脚按钮类似的行为.
我正在使用C#,Visual Studio 2012和Excel 2010.我使用Ribbon XML方法创建了自定义功能区.
当我运行下面的代码时,我想在我的形状中填充 (255,168,0) 颜色,它会给我一个浅一点的蓝色。
private void Shape_fill_Click(object sender, RibbonControlEventArgs e)
{
Color_palette.Visible = true;
type = "Fill";
}
private void btn_Orange_Click(object sender, RibbonControlEventArgs e)
{
if(type=="Fill")
{
PowerPoint.Application ppApp = Globals.ThisAddIn.Application;
PowerPoint.ShapeRange ppshr = ppApp.ActiveWindow.Selection.ShapeRange;
ppshr.Fill.ForeColor.RGB = System.Drawing.Color.FromArgb(255,168,0).ToArgb();
}
Run Code Online (Sandbox Code Playgroud)
问题:除了浅蓝色之外,如何获得不同或变化的颜色?
c# add-in visual-studio-addins visual-studio-2013 powerpoint-2013
我想安装基于excel版本(32位或64位)的vsto插件。我计划捆绑 32 位和 64 位 msis 并通过确定 excel 版本来安装一个。我可以找到这个链接,通过使用注册表来检测 2010 office 是 32 位还是 64 位。 通过注册表检测 Office 是 32 位还是 64 位 但我想检查 excel 2007 和 2013 是 32 位还是 64 位。是否可以通过注册表检测它们。
我创建了一个名为的 excel 加载项
项目计数_每人.xlam
当我打开 excel 并转到 Development>AddIns 并选择我的 AddIn 进行安装时,如果我在保存后关闭 excel,它也不会保持安装状态。我制作的插件在“插件”选项卡下创建了一个新的 MenuBarButton
所以我创建了一个新的注册表项来在启动时安装插件
HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\ProjectCount_PerPerson
钥匙看起来像这样
(Default) REG_SZ (value not set)
Description REG_SZ Project Count_Per Person
FriendlyName REG_SZ Project Count_Per Person
LoadBehavior DWORD 0x00000003 (3)
Manifest REG_SZ C:\Users\b012918\AppData\Roaming\Microsoft\AddIns\Project Count_Per Person.xlam
Run Code Online (Sandbox Code Playgroud)
当我启动 Excel 时,它显示它正在安装 AddIn,但随后我得到一个
异常读取清单来自
file:///C:/Users/b012918/AppData/Roaming/Microsoft/AddIns/Project%Count_Per%Person.xlam:
清单可能无效或无法打开文件。
任何对我搞砸的事情的见解都会有所帮助。
附加信息:
如果在我启动 excel 时卸载了插件,则会出现清单错误。如果在我启动 excel 时“检查”了插件,它会在下面的评论中给出下载错误。即使之前安装了插件,CommandBarButton 也不会留在原位。此外,在选项--> 插件下,插件被声明为“活动”。
在 Outlook COM 加载项 (C#) 中,我能够像这样在 Outlook 中检索所有选定的邮件
var selection = Globals.ThisAddIn.Application.ActiveExplorer().Selection;
List<Outlook.MailItem> outlookMailList = new List<Outlook.MailItem>();
foreach (object mail in selection)
outlookMailList.Add((Outlook.MailItem)mail);Run Code Online (Sandbox Code Playgroud)
将选定的邮件与一些元数据存储在 DMS 中。
现在我想用 Javascript API for Office (office.js) 做同样的事情。
这里的正确入口点是什么?因为当我在 Outlook 中选择多封邮件时,默认功能区中的 OutlookTab 按钮将被停用。
另见http://bettersolutions.com/javascript-api/hosts/extensionpoint.htm
selectedMail = Office.context.mailbox.item;Run Code Online (Sandbox Code Playgroud)
我现在如何获取 Outlook 中所有标记邮件的数据。我希望有类似的东西
selectedMails = Office.context.mailbox.items;
// OR
selectedMails = Office.context.mailbox.selectedItems;Run Code Online (Sandbox Code Playgroud)
有人知道如何检索哪些邮件被选择到 TaskPane 或 CustomPane 的信息吗?分别是否有可能?非常感谢。
outlook add-in outlook-addin javascript-api-for-office office-js
众所周知,Word 不像 PowerPoint 或 Excel 那样提供 SaveCopyAs。我尝试了不同的方法,但没有令人满意的结果。
我可以使用正确的格式(元素定位 -> wdPasteDefault)或正确的样式(字体和颜色 -> wdPasteDefault)即时复制文档。
如果用户关闭原始文档,则必须询问他是否应保存文档并选择路径。
目前我已经在 Word 2016 上尝试了不同的方法。最后我想支持 2010 到 2016。
一种方法是:
object wdWhat = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage;
object wdWhich = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToAbsolute;
Microsoft.Office.Interop.Word.Range range = document.Range(ref missObj, ref missObj);
Microsoft.Office.Interop.Word.Range pageRange = document.Range(ref missObj, ref missObj);
pageRange.Start = range.GoTo(ref wdWhat, ref wdWhich, ref missObj, ref missObj).Start;
pageRange.End = document.Range(ref missObj, ref missObj).End;
pageRange.Copy();
Microsoft.Office.Interop.Word.Document newDoc = AddinModule.CurrentInstance.WordApp.Documents.Add(ref missObj, ref missObj, ref missObj, ref missObj);
newDoc.PageSetup.PageWidth = document.PageSetup.PageWidth;
newDoc.PageSetup.PageHeight = document.PageSetup.PageHeight;
AddinModule.CurrentInstance.WordApp.Selection.PasteAndFormat(Microsoft.Office.Interop.Word.WdRecoveryType.wdPasteDefault);
object newDocName …Run Code Online (Sandbox Code Playgroud)