Возникли проблемы при написании простого макроса VS2010 - PullRequest
0 голосов
/ 26 августа 2011

Я пытаюсь написать простой макрос 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 голосов
/ 11 сентября 2012

Ваш 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

Я думаю, вы должны сделать то же самое, если хотите поместить что-то в буфер обмена.

0 голосов
/ 27 августа 2011

Я проверил ваш код, и проблема в том, что GetText() возвращает пустую строку.Когда вы устанавливаете Find.FindWhat с пустой строкой, она выдает ошибку.Для теста попробуйте явно установить Find.FindWhat в строковый литерал, такой как «hello», и посмотрите, не сбоит ли код по-прежнему (в моем тесте это не так).

Если нет, тогда возникает вопрос, почему GetTest() возвращает пустую строку.После некоторого возни я нашел другой поток, в котором обсуждается то же самое:

Clipboard.GetText возвращает ноль (пустая строка)

Возможно, вы захотите проверить это (решение в C #).Что касается кода VB, я нашел другой поток, который вы могли бы попробовать:

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

Выглядит как раздражающая ошибка для меня.Удачи!

...