簡體   English   中英

如何在Visual Studio插件中阻止OpenFile

[英]How to block on a OpenFile in a Visual Studio addin

我有一個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.在一個不那么重要的注意事項中,有沒有一種方法可以像這樣進行搜索而不會在“查找結果”窗格中顯示結果(這會導致我的舊結果被此搜索清除,該搜索僅用於將光標移至那部分文件)?


如果OpenFile異步運行,我建議您考慮更改邏輯以依賴於不同的事件,該事件依賴於正在激活的文檔。

例如,您是否嘗試使用快捷鍵觸發OpenFile,然后對搜索進行排隊,以便稍后由VS事件處理? (以下代碼取自Visual Studio 2010插件,但我相信事件是相同的。)

//確保這些是類變量,否則它們可能會錯誤地得到GC並破壞COM交互私有WindowEvents _winEvents = null; private 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);

在那里,你會看到你想要掃描的文件(你可能需要保留一個列表等)。

對於第二個問題,一旦您按照我上面建議的方式訪問,您就可以自己掃描文檔。

我認為,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類,用於跟蹤文本視圖的創建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM