• VB2005编写外接程序的一些有用函数


    以下代码对于外接程序的制作非常有用,
    注意:在DTE80下处理项目需要使用DTE7中的类,而不是DTE80。

    Imports System
    Imports Microsoft.VisualStudio.CommandBars
    Imports Extensibility
    Imports EnvDTE
    Imports EnvDTE80
    Module modFuns

        ''' <summary>
        ''' 获取当前语言版本的菜单标题字符串.
        ''' </summary>
        ''' <param name="resKey">标准字符串名称.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetDTEMenuName(ByVal resKey As String) As String
            '    功能:该代码实现从资源文件中读取DTE的菜单标题
            '完成日期:2006-01-13
            Dim ResMg As System.Resources.ResourceManager = New System.Resources.ResourceManager("CoderHelper.CommandBar", System.Reflection.Assembly.GetExecutingAssembly())
            Dim CultureInfo As System.Globalization.CultureInfo = New System.Globalization.CultureInfo(chDTE.LocaleID)
            Dim chMenuName As String = ResMg.GetString(String.Concat( _
                                        CultureInfo.TwoLetterISOLanguageName _
                                        & IIf(CultureInfo.TwoLetterISOLanguageName = "zh", _
                                        "-" & CultureInfo.ThreeLetterWindowsLanguageName.ToString, _
                                        "").ToString, resKey))
            '根据CommandBar.resx的资源分析,该资源中仅仅包含了中文的多类别,既简体和繁体两种,对这两种
            '语言而言, 需要指定 CultureInfo.ThreeLetterWindowsLanguageName是'CHS'还是'CHT',然后与zh
            '之间需要 '-'隔开故.判断如果为'zh'则追加加字符串CultureInfo.ThreeLetterWindowsLanguageName
            '然后与Concat 的第二个参数连接出一字符串给GetString()
            '该方法仅仅用于该语言资源包.且,该资源包完全能够胜任开发任何一种语言的外接程序
            Return chMenuName
        End Function
        ''' <summary>
        ''' 添加命令.
        ''' </summary>
        ''' <param name="CmdName">工具条名称</param>
        ''' <param name="SubItemName">工具条子项目名称</param>
        ''' <param name="Name">要添加的项目名称,</param>
        ''' <param name="Caption"> 要添加的项目标题.该标题还用于删除该按钮/项</param>
        ''' <param name="Position">在SubItemName 项目中的位置</param>
        ''' <param name="Tooltip">按钮的提示条</param>
        ''' <param name="IconID">按钮的图标代码,该代码未Office表情代码,如果要自定义,请设置MsoButton为假</param>
        ''' <param name="MsoButton">真时使用Office中的表情图标,假时使用附属资源DLL中的图片</param>
        ''' <param name="AtAfterItem">设定按钮的位置是否在一个按钮项的后面.</param>
        ''' <param name="AIID">参照项ID 如果AtAfterItem 为真,则按钮位置将是SubItemName 项中第 AIID +Position 项.</param>
        ''' <param name="NeedRegAlias">决定是不是需要为该命令注册别名,以便在命令窗口执行.</param>
        ''' <param name="DontAddToCmdBar"> 不要添加到按钮或工具条中或菜单项中.</param>
        ''' <returns></returns>
        ''' <remarks>注意:该函数建议采用于菜单的添加操作</remarks>
        Public Function AddCommand(ByVal CmdName As String, _
                                    ByVal SubItemName As String, _
                                    ByVal Name As String, _
                                    ByVal Caption As String, _
                                    Optional ByVal Position As Integer = 1, _
                                    Optional ByVal Tooltip As String = vbNullChar, _
                                    Optional ByVal IconID As Object = Nothing, _
                                    Optional ByVal MsoButton As Boolean = True, _
                                    Optional ByVal AtAfterItem As Boolean = False, _
                                    Optional ByVal AIID As Integer = 0, _
                                    Optional ByVal NeedRegAlias As Boolean = True, _
                                    Optional ByVal DontAddToCmdBar As Boolean = False) As Exception

            Dim Cmds As Commands2 = CType(chDTE.Commands, Commands2)
            Dim CmdBars As CommandBars = CType(chDTE.CommandBars, CommandBars)
            Dim mnuBarCmdBar As CommandBar = CmdBars.Item(CmdName) '菜单
            Dim CmdCtrl As CommandBarControl = mnuBarCmdBar.Controls.Item(SubItemName)
            Dim CmdPopup As CommandBarPopup = CType(CmdCtrl, CommandBarPopup)
            Try
                Dim chCmdConfig As Command = Cmds.AddNamedCommand2( _
                                                chAddIN, Name, Caption, Tooltip, _
                                                  MsoButton, _
                                                 IconID, _
                                                 Nothing, _
                                                CType(vsCommandStatus.vsCommandStatusSupported, Integer) + CType(vsCommandStatus.vsCommandStatusEnabled, Integer), _
                                                vsCommandStyle.vsCommandStylePictAndText, _
                                                vsCommandControlType.vsCommandControlTypeButton)
                If DontAddToCmdBar = False Then
                    Try
                        If AIID <> 0 Then
                            chCmdConfig.AddControl(CmdPopup.CommandBar, _
                                                 CInt(IIf(AtAfterItem, _
                                                          CmdPopup.CommandBar.FindControl(Id:=AIID).Index + Position, _
                                                          Position)))
                        Else
                            chCmdConfig.AddControl(CmdPopup.CommandBar, Position)
                        End If

                    Catch ex As Exception
                        chOutText("向" & CmdPopup.Caption & "中添加" & chCmdConfig.Name & "不成功!")
                    End Try
                End If
                If NeedRegAlias Then
                    RegAlias(chAddIN.Name & ".Connect." & Name, "ch" & Name.ToLower)
                    '外接程序的命令总是以外接程序名称和Connect 类的名称为前缀的.
                    '同时本程序为了方便使用由本程序提供的外接,在别名前加 "ch" ,
                    '程序以小写为基准.
                End If
                Return (Nothing)

            Catch ex As Exception
                chOutText("向[" & SubItemName & "]中添加[" & Caption & "]项和命令'" & Name & "'失败!")
                Return ex
            End Try
        End Function
        ''' <summary>
        '''
        ''' </summary>
        ''' <param name="Owner">拥有该命令和项的菜单或工具条</param>
        ''' <param name="Name">命令名称.</param>
        ''' <param name="Caption">要添加的项目标题.该标题还用于删除该按钮/项</param>
        ''' <param name="Position">在SubItemName 项目中的位置</param>
        ''' <param name="Tooltip">按钮的提示条</param>
        ''' <param name="IconID"> 按钮的图标代码,该代码未Office表情代码,如果要自定义,请设置MsoButton为假</param>
        ''' <param name="MsoButton">真时使用Office中的表情图标,假时使用附属资源DLL中的图片</param>
        ''' <param name="AtAfterItem">设定按钮的位置是否在一个按钮项的后面.</param>
        ''' <param name="AIID"> 参照项ID 如果AtAfterItem 为真,则按钮位置将是SubItemName 项中第 AIID +Position 项.</param>
        ''' <param name="NeedRegAlias">决定是不是需要为该命令注册别名,以便在命令窗口执行.</param>
        ''' <param name="DontAddToCmdBar">不要添加到按钮或工具条中或菜单项中.</param>
        ''' <returns></returns>
        ''' <remarks>注意:该函数建议采用于菜单的添加操作</remarks>
        Public Function AddCommand(ByVal Owner As CommandBarControl, _
                                       ByVal Name As String, _
                                       ByVal Caption As String, _
                                       Optional ByVal Position As Integer = 1, _
                                       Optional ByVal Tooltip As String = vbNullChar, _
                                       Optional ByVal IconID As Object = Nothing, _
                                       Optional ByVal MsoButton As Boolean = True, _
                                       Optional ByVal AtAfterItem As Boolean = False, _
                                       Optional ByVal AIID As Integer = 0, _
                                       Optional ByVal NeedRegAlias As Boolean = True, _
                                       Optional ByVal DontAddToCmdBar As Boolean = False) As Exception
     
            '
            Dim Cmds As Commands2 = CType(chDTE.Commands, Commands2)
            Dim CmdBars As CommandBars = CType(chDTE.CommandBars, CommandBars)
            Dim mnuBarCmdBar As CommandBar = CmdBars.Item("MenuBar") '菜单
            Dim CmdPopup As CommandBarPopup = CType(Owner, CommandBarPopup)
            Dim ctl As CommandBarControl = Nothing
            Try
                Dim chCmdConfig As Command = Cmds.AddNamedCommand2( _
                                                chAddIN, Name, Caption, Tooltip, _
                                                  MsoButton, _
                                                 IconID, _
                                                 Nothing, _
                                                CType(vsCommandStatus.vsCommandStatusSupported, Integer) + CType(vsCommandStatus.vsCommandStatusEnabled, Integer), _
                                                vsCommandStyle.vsCommandStylePictAndText, _
                                                vsCommandControlType.vsCommandControlTypeButton)
                If DontAddToCmdBar = False Then
                    Try
                        If AIID <> 0 Then
                            chCmdConfig.AddControl(CmdPopup.CommandBar, _
                                                 CInt(IIf(AtAfterItem, _
                                                          CmdPopup.CommandBar.FindControl(Id:=AIID).Index + Position, _
                                                          Position)))
                        Else
                            chCmdConfig.AddControl(CmdPopup.CommandBar, Position)
                        End If

                    Catch ex As Exception
                        chOutText("向" & CmdPopup.Caption & "中添加" & chCmdConfig.Name & "不成功!")
                    End Try
                End If
                If NeedRegAlias Then
                    RegAlias(chAddIN.Name & ".Connect." & Name, "ch" & Name.ToLower)
                    '外接程序的命令总是以外接程序名称和Connect 类的名称为前缀的.
                    '同时本程序为了方便使用由本程序提供的外接,在别名前加 "ch" ,
                    '程序以小写为基准.
                End If
                Return Nothing

            Catch ex As Exception
                chOutText("向[" & CType(Owner, CommandBarControl).Caption & "]中添加[" & Caption & "]项和命令'" & Name & "'失败!")
                Return ex
            End Try
        End Function

        ''' <summary>
        ''' 简单的添加命令
        ''' </summary>
        ''' <param name="cName">命令名称</param>
        ''' <param name="cAlias">别名</param>
        ''' <remarks>用于添加命令行直接执行的命令.</remarks>
        Public Sub AddCmd(ByVal cName As String, Optional ByVal cAlias As String = "")
            Try
                Dim cmds As Commands2 = CType(chDTE.Commands, Commands2)
                cmds.AddNamedCommand2(chAddIN, cName, cName, cName, True)
            Catch ex As Exception
                chOutText("添加命令[" & cName & "]失败!")
            End Try
            Try
                If cAlias.Trim <> "" Then
                    RegAlias(chAddIN.Name & ".Connect." & cName, "ch" & cAlias.ToLower)
                End If
            Catch ex As Exception
            End Try
        End Sub


        ''' <summary>
        ''' 删除一个命令.
        ''' </summary>
        ''' <param name="cName">名称.</param>
        ''' <param name="cAlias">别名</param>
        ''' <remarks></remarks>
        Public Sub DelCmd(ByVal cName As String, Optional ByVal cAlias As String = "")
            Try
                Dim cmds As Commands2 = CType(chDTE.Commands, Commands2)
                cmds.Item(cName).Delete()

            Catch ex As Exception
                chOutText("删除命令[" & cName & "]失败!")
            End Try
            Try
                RegAlias("", "ch" & cAlias.ToLower, True)
            Catch ex As Exception

            End Try
        End Sub


        ''' <summary>
        ''' 从菜单或工具条中删除指定的命令
        ''' </summary>
        ''' <param name="CmdName"></param>
        ''' <param name="SubItemName"></param>
        ''' <param name="Name"></param>
        ''' <param name="Caption"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function DeleteCommand(ByVal CmdName As String, ByVal SubItemName As String, ByVal Name As String, ByVal Caption As String) As Exception
            'CmdName 工具条名称, SubItemName 工具条子项目名称,Name 要添加的项目名称,
            'Caption 要添加的项目标题.此方法内用于删除该按钮/项
            Dim e As Exception = Nothing
            Dim Cmds As Commands2 = CType(chDTE.Commands, Commands2)
            Dim CmdBars As CommandBars = CType(chDTE.CommandBars, CommandBars)
            Dim mnuBarCmdBar As CommandBar = CmdBars.Item(CmdName) '菜单
            Dim CmdCtrl As CommandBarControl = mnuBarCmdBar.Controls.Item(SubItemName)
            Dim CmdPopup As CommandBarPopup = CType(CmdCtrl, CommandBarPopup)
            Try
                Cmds.Item(chAddIN.Name & ".Connect." & Name).Delete()
                RegAlias(chAddIN.Name & ".Connect." & Name, "ch" & Name.ToLower, True)
            Catch ex As Exception
                e = ex
            End Try
            Try
                Dim chCmdConfig As CommandBarControl = CmdPopup.Controls(Caption)
                chCmdConfig.Delete()
            Catch ex As Exception
                e = ex
            End Try
            Return e
        End Function

        ''' <summary>
        ''' 删除指定菜单或工具条中的命令.
        ''' </summary>
        ''' <param name="Owner">所有者</param>
        ''' <param name="Name">名称.</param>
        ''' <param name="Caption">标题</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function DeleteCommand(ByVal Owner As CommandBarControl, ByVal Name As String, ByVal Caption As String) As Exception
            'CmdName 工具条名称, SubItemName 工具条子项目名称,Name 要添加的项目名称,
            'Caption 要添加的项目标题.此方法内用于删除该按钮/项
            Dim e As Exception = Nothing
            Dim Cmds As Commands2 = CType(chDTE.Commands, Commands2)
            Dim CmdBars As CommandBars = CType(chDTE.CommandBars, CommandBars)
            Dim mnuBarCmdBar As CommandBar = CmdBars.Item("MenuBar") '菜单
            Dim CmdCtrl As CommandBarControl = Owner
            Dim CmdPopup As CommandBarPopup = CType(CmdCtrl, CommandBarPopup)
            Try
                Cmds.Item(chAddIN.Name & ".Connect." & Name).Delete()
                RegAlias(chAddIN.Name & ".Connect." & Name, "ch" & Name.ToLower, True)
            Catch ex As Exception
                e = ex
            End Try
            Try
                Dim chCmdConfig As CommandBarControl = CmdPopup.Controls(Caption)
                chCmdConfig.Delete()
            Catch ex As Exception
                e = ex
            End Try
            Return e
        End Function
        ''' <summary>
        ''' 注册别名.
        ''' </summary>
        ''' <param name="cCmd">完整命令</param>
        ''' <param name="cAlias">别名</param>
        ''' <param name="bDelete">是删除还是注册.T.删除.</param>
        ''' <remarks></remarks>
        Public Sub RegAlias(ByVal cCmd As String, ByVal cAlias As String, Optional ByVal bDelete As Boolean = False)
        
            Try
                chDTE.ExecuteCommand("Tools.Alias ", cAlias & "    " & IIf(bDelete, "  /delete", cCmd).ToString)
                My.Settings.chAliasList = IIf(bDelete, _
                                              Replace(My.Settings.chAliasList, cAlias & Space(4) & cCmd & vbCrLf, ""), _
                                              My.Settings.chAliasList & cAlias & Space(4) & cCmd & vbCrLf).ToString
                chOutText(IIf(bDelete, "删除", "注册").ToString & "别名'" & cAlias & "'成功!", bMustOut:=False)
            Catch ex As Exception
                chOutText(IIf(bDelete, "删除", "注册").ToString & "别名" & cAlias & "失败!")
            End Try

        End Sub


        ''' <summary>
        ''' 在输出窗口和状态条中显示文本
        ''' </summary>
        ''' <param name="Text">为要输出的文本内容</param>
        ''' <param name="cCrlf">决定是不是要换行,默认为换行</param>
        ''' <param name="bMustOut">决定该输出是不是必须输出的.</param>
        ''' <remarks>如果不是重要的信息, 用户的不显示详细信息设置将过滤该输出信息</remarks>
        Public Sub chOutText(ByVal Text As String, Optional ByVal cCrlf As Boolean = True, Optional ByVal bMustOut As Boolean = True)


            Try
                If bMustOut Or My.Settings.modFuns_OutAllInf = True Then
                    '如果该字符串要求必须输出或不要求必须输出但是用户要求显示所有输出信息时执行下面的操作
                    chOutWin.OutputString(Text & IIf(My.Settings.modFuns_NeedTime, Now.TimeOfDay.ToString, "").ToString & IIf(cCrlf, vbCrLf, Nothing).ToString)
                    chDTE.StatusBar.Text = "CoderHelper::" & Text
                End If
            Catch ex As Exception

            End Try
        End Sub
        ''' <summary>
        ''' 这执行DTE中的命令.
        ''' </summary>
        ''' <param name="Cmd">命令名称.</param>
        ''' <param name="cParam">参数.</param>
        ''' <remarks>显示执行了何种命令..</remarks>
        Public Sub chExcCmd(ByVal Cmd As String, Optional ByVal cParam As String = "")
            Try
                chDTE.ExecuteCommand(Cmd, cParam)
                chOutText("调用:" & Cmd & "(" & cParam & ")成功!", bMustOut:=False)
            Catch ex As Exception
                chOutText("调用开发环境命令:" & Cmd & "(" & cParam & ") 时出错:" & ex.Message)
            End Try
        End Sub
        ''' <summary>
        ''' 内部调用DTE命令.
        ''' </summary>
        ''' <param name="cmd">命令名称.</param>
        ''' <param name="cparam">参数</param>
        ''' <remarks>内部调用.由本程序使用</remarks>
        Public Sub chExc(ByVal cmd As String, Optional ByVal cparam As String = "")
            Try
                chDTE.ExecuteCommand(cmd, cparam)
            Catch ex As Exception

            End Try
        End Sub
        ''' <summary>
        ''' 如果执行了命令行,向命令行当前位置输出文本信息.
        ''' </summary>
        ''' <param name="Text"></param>
        ''' <remarks></remarks>
        Public Sub chOutRet(ByVal Text As String)
            Try
                chDTE.ToolWindows.CommandWindow.OutputString(Text & vbCrLf)
            Catch ex As Exception

            End Try
        End Sub
        ''' <summary>
        ''' 在命令行运行命令.
        ''' </summary>
        ''' <param name="cmd">命令</param>
        ''' <param name="Exc">是不是立刻执行.</param>
        ''' <remarks></remarks>
        Public Sub chCmdExc(ByVal cmd As String, Optional ByVal Exc As Boolean = True)
            Try
                chDTE.ToolWindows.CommandWindow.SendInput(cmd, Exc)
            Catch ex As Exception

            End Try
        End Sub

        ''' <summary>
        ''' 添加一个工具条
        ''' </summary>
        ''' <param name="Name">工具条名称</param>
        ''' <returns>返回工具条名称</returns>
        ''' <remarks></remarks>
        Public Function SetToolBar(ByVal Name As String) As CommandBar
            Dim tm1 As CommandBars = CType(chDTE.CommandBars, CommandBars)
            Dim cmd As CommandBar
            If IsNothing(tm1.Item(Name)) Then
                cmd = tm1.Add(Name)
            Else
                cmd = tm1.Item(Name)
            End If
            Return cmd
        End Function
        ''' <summary>
        ''' 获取一个工具条名称.
        ''' </summary>
        ''' <param name="Name">存在的工具条名称.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function SetMenuBar(ByVal Name As String) As CommandBarControl
            Dim Cmds As Commands2 = CType(chDTE.Commands, Commands2)
            Dim CmdBars As CommandBars = CType(chDTE.CommandBars, CommandBars)
            Dim mnu As CommandBar = CmdBars.Item("MenuBar") '菜单
            Try
                Dim ctl As CommandBarControl = mnu.Controls.Add(10, Before:=21)
                '添加在工具菜单后面.工具菜单的INDEX为20
                ctl.Caption = Name
                ctl.Tag = Name
                Return ctl
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
        ''' <summary>
        ''' 获取一个指定名称的菜单项或工具条项对象.
        ''' </summary>
        ''' <param name="Name">名称.</param>
        ''' <param name="AIID"> </param>
        ''' <param name="OwnerName"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function SetMenuItem(ByVal Name As String, Optional ByVal AIID As Long = 943, Optional ByVal OwnerName As String = "Tools") As CommandBarControl
            Dim Cmds As Commands2 = CType(chDTE.Commands, Commands2)
            Dim CmdBars As CommandBars = CType(chDTE.CommandBars, CommandBars)
            Dim mnuBarCmdBar As CommandBar = CmdBars.Item("MenuBar") '菜单
            Dim CmdCtrl As CommandBarControl = mnuBarCmdBar.Controls.Item(GetDTEMenuName(OwnerName))
            Dim CmdPopup As CommandBarPopup = CType(CmdCtrl, CommandBarPopup)
            Dim ret As CommandBarControl

            ' Cmds.AddCommandBar("fads", vsCommandBarType.vsCommandBarTypePopup)

            If AIID > 0 Then

                ret = CmdPopup.Controls.Add(10, Before:=CmdPopup.CommandBar.FindControl(Id:=AIID).Index + 1)
            Else
                ret = CmdPopup.Controls.Add(10, 1)
            End If
            ret.Caption = Name
            Return ret
        End Function
    End Module

  • 相关阅读:
    LINQ标准查询操作符及例子(转载)
    Winform Combox 下拉模糊匹配
    在RowDataBound事件中取值的几种方法 转载
    shell脚本作业练习题8.6
    7.31.... 简单的python代码
    shell 脚本——第一节课 bash的基本特性
    shell 脚本——第二节课 重定向和管道符
    730
    应用范例:解析 Yahoo 奇摩股市的各档股票资讯HtmlAgilityPack
    微软一个罕为人知的无敌命令
  • 原文地址:https://www.cnblogs.com/MysticBoy/p/340777.html
Copyright © 2020-2023  润新知