4

特定のホットキーを押すと、特定のファイル (ホットキーのコンテキストに基づいて異なる) が開き、そのファイルで特定の文字列 (これもコンテキストに依存します) を検索する Visual Studio 2008 アドインがあります。これは問題なく機能しますが、開いているファイルが大きすぎると、検索が失敗することがあります。

コード スニペットを次に示します。

Window xmlWindow = Commands.Application.ItemOperations.OpenFile(objectFilename, EnvDTE.Constants.vsViewKindPrimary);
Find find = xmlWindow.Document.DTE.Find;
find.Action = vsFindAction.vsFindActionFind;
find.FindWhat = String.Format("Name=\"{0}\"", objectLocalName);
if (find.Execute() == vsFindResult.vsFindResultFound) {
     MessageBox.Show("Found!");
}



1. 常に機能するようにする方法はありますか (たとえば、OpenFile をブロックするなど)?

2. あまり重要ではありませんが、結果が [検索結果] ペインに表示されることなく、このように検索する方法はありますか (これにより、カーソルを下に移動するためだけに使用されるこの検索によって古い結果が消去されます)。ファイルのその部分)?


4

2 に答える 2

11

OpenFileが非同期で動作する場合は、アクティブ化されているドキュメントに依存する別のイベントに依存するようにロジックを変更することを検討することをお勧めします。

たとえば、ショートカットキーを使用してOpenFileをトリガーしてから、検索をキューに入れて、後でVSイベントで処理できるようにしたことがありますか?(以下のコードはVisual Studio 2010アドインから取得したものですが、イベントは同じだと思います。)

//これらがクラス変数であることを確認してください。そうしないと、GCが正しく行われず、COMの相互作用が中断される可能性がありますprivate WindowEvents _winEvents = null; プライベートDTE2_applicationObject;

接続で:

_events = _applicationObject.Events;
_winEvents = _events.get_WindowEvents();

_winEvents.WindowActivated += new _dispWindowEvents_WindowActivatedEventHandler(WindowActivated);

次に、WindowActivatedにいくつかのコードを配置します。

void WindowActivated(Window GotFocus, Window LostFocus)
        {
            Document gotFocusDoc = GotFocus.Document;
            if (gotFocusDoc != null)
            {
                string fileExt = Path.GetExtension(gotFocusDoc.Name);

そこで、スキャンしたいファイルを監視します(リストなどを保持する必要があるかもしれません)。

2番目の問題については、上記で提案した方法でアクセスできるようになったら、自分でドキュメントをスキャンするだけで済みます。

于 2010-07-19T12:50:59.687 に答える
0

DTE.ItemOperations.OpenFile() メソッドは同期的だと思います。VS2008 用の次のコード スニペットを使用してみてください。

using EnvDTE;

Window win = _applicationObject.ItemOperations.OpenFile(@"path-to-xml-file", Constants.vsViewKindPrimary);
TextDocument doc = win.Document.Object("TextDocument") as TextDocument;
if (doc != null)
{
    EditPoint searchStart = doc.StartPoint.CreateEditPoint();
    EditPoint endOfFoundText = null;
    TextRanges ranges = null;

    bool result = searchStart.FindPattern("Text-to-search", (int)vsFindOptions.vsFindOptionsNone, ref endOfFoundText, ref ranges);
    if (result)
    {
        // Result is bounded by searchStart and endOfFoundText points.
        System.Windows.Forms.MessageBox.Show("BINGO! Found at " + searchStart.Line.ToString());
    }
}

開いているウィンドウをキャッチするのに問題がある場合は、拡張機能WordLightのソース コードを確認することをお勧めします。テキスト ビューの作成を追跡する WindowWatcher クラスがあります。

于 2010-07-21T09:35:14.297 に答える