1

如何在 SSMS 2008R2\2012 对象资源管理器中添加我的右键菜单?我研究了这个话题。

我这样做:

private void Provider_SelectionChanged(object sender, NodesChangedEventArgs args)
        {            
            INodeInformation[] nodes;
            int nodeCount;

            objectExplorer.GetSelectedNodes(out nodeCount, out nodes);
            INodeInformation node = (nodeCount > 0 ? nodes[0] : null);

            if (_databaseMenu == null &&
                _databaseRegex.IsMatch(node.Context))
            {
                _databaseMenu = (HierarchyObject)node.GetService(typeof(IMenuHandler));
                _databaseMenu.AddChild(string.Empty, new MenuItem());
            }            
        }

但问题是:如果我左键单击数据库然后右键单击 - 我看到我的菜单,好的。如果我通过 (+) 展开对象树,然后立即右键单击数据库 - 我看不到我的菜单。我明白为什么会这样,但是如何解决这个问题?

4

1 回答 1

1

我为自己的 SSMS 加载项花费了大量时间来解决同样的问题。我想出的是一个肮脏的黑客,但这是我能找到让它可靠工作的唯一方法。

您使用SendKeys.SendWait发出 SHIFT + F10,这是打开上下文菜单的快捷方式,并且您执行了两次,因为单次发​​出将切换菜单的状态(可见到不可见,反之亦然)。如果你使用 UI 会停止响应并最终抛出Send,所以一定要使用SendWait.

左键单击或右键单击菜单会有轻微延迟。而且,当然,如果用户更改了该快捷方式(或定义了外部的替代宏),这将不起作用,但快速浏览 SSMS 选项不会显示任何更改上下文菜单快捷方式的方法。

    private void Provider_SelectionChanged(object sender, NodesChangedEventArgs args)
    {            
        INodeInformation[] nodes;
        int nodeCount;

        objectExplorer.GetSelectedNodes(out nodeCount, out nodes);
        INodeInformation node = (nodeCount > 0 ? nodes[0] : null);

        if (_databaseMenu == null &&
            _databaseRegex.IsMatch(node.Context))
        {
            _databaseMenu = (HierarchyObject)node.GetService(typeof(IMenuHandler));
            _databaseMenu.AddChild(string.Empty, new MenuItem());
            SendKeys.SendWait("+({F10})")
            SendKeys.SendWait("+({F10})")
        }            
    }
于 2012-10-10T21:45:56.293 回答