C# 如何在Visual Studio中阻止OpenFile插件
我有一个Visual Studio 2008插件,当我按下某个热键时,它会打开一个特定的文件(根据热键的上下文不同),然后搜索该文件中的特定字符串(同样,取决于上下文)。大多数情况下,这项工作都是完美的,但有时如果它打开的文件太大,搜索就会失败 以下是一段代码片段:C# 如何在Visual Studio中阻止OpenFile插件,c#,visual-studio-2008,visual-studio-addins,envdte,C#,Visual Studio 2008,Visual Studio Addins,Envdte,我有一个Visual Studio 2008插件,当我按下某个热键时,它会打开一个特定的文件(根据热键的上下文不同),然后搜索该文件中的特定字符串(同样,取决于上下文)。大多数情况下,这项工作都是完美的,但有时如果它打开的文件太大,搜索就会失败 以下是一段代码片段: Window xmlWindow = Commands.Application.ItemOperations.OpenFile(objectFilename, EnvDTE.Constants.vsViewKindPrimary);
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.另一个不太重要的注意事项是,有没有一种方法可以这样搜索,而不让结果出现在“查找结果”窗格中(这会导致我的旧结果被此搜索清除,而此搜索仅用于将光标向下移动到文件的该部分)
>B/>P> < P>如果OpenFILE异步运行,我建议您考虑更改逻辑,以依赖不同的事件,一个依赖于正在激活的文档。
例如,您是否尝试过用快捷键触发OpenFile,然后将搜索排队,以便稍后由VS事件处理它?(下面的代码取自Visual Studio 2010插件,但我相信事件是相同的。) //确保这些是类变量,否则它们可能会得到错误的GC,并中断COM交互 私有WindowEvents _winEvents=null; 私有DTE2_应用对象 在连接中:_events = _applicationObject.Events;
_winEvents = _events.get_WindowEvents();
_winEvents.WindowActivated += new _dispWindowEvents_WindowActivatedEventHandler(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());
}
}
如果您在捕获打开的窗口时遇到问题,我建议检查我的扩展的源代码:有一个WindowWatcher类,它跟踪文本视图的创建 当你说“搜索失败”时。。。这意味着它不会返回预期的结果,或者会出现错误消息?它不会返回预期的结果,因为搜索实际上是在当前打开的选项卡上执行的,而不是在它试图打开的选项卡上执行的。