使用 Visual Studio 扩展动态添加工具按钮

Posted

技术标签:

【中文标题】使用 Visual Studio 扩展动态添加工具按钮【英文标题】:Add a tool button dynamically with Visual Studio extensions 【发布时间】:2022-01-10 11:18:09 【问题描述】:

我正在构建一个 Visual Studio 扩展,它应该在 ToolBar 或 ToolStrip 上添加我的工具按钮。

有两种情况:

第一种情况,将我的红色按钮添加到由另一个扩展(Visual Micro)添加的工具栏/工具条中,见图 1。

第二种情况,将我的红色按钮添加到 Visual Studio UI 的属性工具栏/工具条中,见图 2。

图片1:

图 2:

我尝试实施第二种情况,但没有任何积极的结果。

代码如下:

EventHandler btnClick = new EventHandler(delegate (Object o, EventArgs a)
            
                //snip
            );
System.Drawing.Image img = System.Drawing.Image.FromFile("W:\\...\\red_btn.png");

ToolStripButton btn = new ToolStripButton("My Button", img, btnClick, "RedButton");
            btn.Width = 32;
            btn.Height = 32;
            btn.Visible = true;
IntPtr hProperties = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "WindowsForms10.Window.8.app.0.c940ee_r43_ad1", null) ;
ToolStrip toolStrip = (ToolStrip)ToolStrip.FromHandle(hProperties);

if (toolStrip != null)

  toolStrip.Items.Add(btn);
  toolStrip.Refresh();
  toolStrip.Visible = true;

当我从 ToolWindow1Control init() 方法执行上述代码时,没有任何反应。我尝试的是从“属性”窗口中找到工具栏的句柄并将我的按钮添加到其中。但这不起作用。

我希望将红色按钮添加到“属性”窗口的工具栏中。这个按钮应该执行一些与当前查看的源文件相关的代码。这是第二种情况。

对于第一种情况,我不知道如何找到该工具栏的句柄来添加我的按钮。

请帮忙。

【问题讨论】:

要扩展 Visual Studio,您不应该破解它,而是使用 Visual Studio API:docs.microsoft.com/en-us/visualstudio/extensibility/… @SimonMourier 感谢您的评论,但有时为了用户界面的简单性或直观性或有其他一些强有力的原因,最好按照我需要的方式扩展它。当然,遵循与此相关的可用文档是一个好习惯,但我想做的不是不允许做的事情,我使用 WinAPI 甚至从扩展内部运行,也许是为了扩展其他扩展功能,等等…… Visual Studio 将 WPF 用于其 UI。因此,您无法检索到任何HWNDs。整个应用程序呈现在一个窗口上。你试图做的事情是不可能的。如果需要向 Visual Studio 的 GUI 添加任何视觉效果,请使用公共 API。这不仅更好,而且是唯一的方法。 【参考方案1】:

WPF 窗口中没有任何工具栏或工具条 HWND。你试图做的事情是不可能的。如果需要向 Visual Studio 的 GUI 添加任何视觉效果,请使用公共 API。这不仅更好,而且是唯一的方法。

【讨论】:

以上是关于使用 Visual Studio 扩展动态添加工具按钮的主要内容,如果未能解决你的问题,请参考以下文章

我可以添加一个代码生成工具,我将其写入我的Visual Studio副本作为扩展吗?

如何使用 Javascript Intellisense 扩展工具在 Visual Studio 2013 中附加到完成列表

visual studio 如何生成动态库

visual studio 2008 c++ 中怎样添加动态链接库?

Visual Studio 2010/2012 Pro Power Tools

在 Visual Studio 2019 C++ 中,如何扩展动态分配的数组以显示其所有元素?