我正在尝试编写一个简单的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()'行上得到'值不在预期范围内'错误。这是我有史以来的第一个视觉工作室宏,所以我有点迷失。
答案 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
如果您想将某些内容放入剪贴板,我认为您必须这样做。