编写简单的VS2010宏时遇到问题

时间:2011-08-26 19:02:41

标签: visual-studio-2010 visual-studio-macros

我正在尝试编写一个简单的visual studio 2010宏来搜索解决方案中的字符串(从剪贴板中获取)

到目前为止:

Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module RecordingModule

    Sub TemporaryMacro()
        DTE.ExecuteCommand("Edit.FindinFiles")
        DTE.Find.FindWhat = My.Computer.Clipboard.GetText()
        DTE.Find.Target = vsFindTarget.vsFindTargetFiles
        DTE.Find.MatchCase = True
        DTE.Find.MatchWholeWord = False
        DTE.Find.MatchInHiddenText = True
        DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
        DTE.Find.SearchPath = "Entire Solution"
        DTE.Find.SearchSubfolders = True
        DTE.Find.FilesOfType = ""
        DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResults2
        DTE.Find.Action = vsFindAction.vsFindActionFindAll
        If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
            Throw New System.Exception("vsFindResultNotFound")
        End If
        DTE.Windows.Item(Constants.vsWindowKindFindReplace).Close()
    End Sub
End Module

不幸的是,它不起作用。当我尝试使用它时,我在'DTE.Find.FindWhat = My.Computer.Clipboard.GetText()'行上得到'值不在预期范围内'错误。这是我有史以来的第一个视觉工作室宏,所以我有点迷失。

2 个答案:

答案 0 :(得分:0)

我测试了你的代码,问题是GetText()返回一个空字符串。当您使用空字符串设置Find.FindWhat时,它会抛出错误。对于测试,尝试将Find.FindWhat显式设置为字符串文字,如“hello”,并查看代码是否仍然崩溃(在我的测试中它没有)。

如果没有,则问题是GetTest()返回空字符串的原因。经过一番探讨,我找到了另一个讨论同样事情的线程:

Clipboard.GetText returns null (empty string)

您可能想要检查出来(解决方案是在C#中)。对于VB代码,我发现了您可能想要尝试的另一个线程:

http://www.dotnetmonster.com/Uwe/Forum.aspx/vs-net-general/10874/Clipboard-GetText-no-longer-working

对我来说,这看起来像一个恼人的错误。祝你好运!

答案 1 :(得分:0)

您的GetText()失败,因为宏未在STA线程中运行。 这听起来很奇怪,但就像这样。 因此,您必须包装GetText(),以便在STA线程内部调用它。 这是我目前使用的一些代码:

Private clipString As String = String.Empty

Function GetClipboardText() As String
    clipString = ""
    Dim data = Clipboard.GetDataObject()
    If Not data Is Nothing Then
        clipString = data.GetData(System.Windows.Forms.DataFormats.StringFormat)
    End If
    ' myString = DataObj.GetText(1)
    ' MsgBox(myString)

    ' clipString = _
    ' Clipboard.GetDataObject() _
    ' .GetData(System.Windows.Forms.DataFormats.StringFormat)
End Function

Private Sub StoreClipBoardText(ByVal s As String)
    clipString = Clipboard.GetDataObject().GetData(System.Windows.Forms.DataFormats.StringFormat)
End Sub

如果您想将某些内容放入剪贴板,我认为您必须这样做。