代码之家  ›  专栏  ›  技术社区  ›  Eduardo Carísio

如何在visual studio 2017 sdk中拦截项目保存事件?

  •  2
  • Eduardo Carísio  · 技术社区  · 8 年前

    更新

    我目前正在开发visual studio 2017的扩展,我需要知道什么时候会有任何更改。

    我试过了 Dte.Events.DocumentEvents.DocumentSaved 事件,但在保存项目中未触发; DTE.Events.SolutionEvents DTE.Events.SolutionItemEvents

    有可能吗?

    2 回复  |  直到 8 年前
        1
  •  5
  •   Eduardo Carísio    8 年前

    在这种情况下,正确的方法是使用机具 IVsRunningDocTableEvents3 覆盖 OnBeforeSave

    通过这种方式,我确切地知道项目何时被保存,并执行它所需要的。

    前任。:

    uint cookie;
    var runningDocumentTable = (IVsRunningDocumentTable)GetGlobalService(typeof(SVsRunningDocumentTable));
    
    runningDocumentTable.AdviseRunningDocTableEvents(new RunningDocTableEventsHandler(), out cookie);
    
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
    namespace YourProject
    {
        internal class RunningDocTableEventsHandler : IVsRunningDocTableEvents3
        {
    
            #region Methods
    
            public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
            {
                return VSConstants.S_OK;
            }
    
            public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
            {
                return VSConstants.S_OK;
            }
    
            public int OnAfterSave(uint docCookie)
            {
                return VSConstants.S_OK;
            }
    
            public int OnAfterAttributeChange(uint docCookie, uint grfAttribs)
            {
                return VSConstants.S_OK;
            }
    
            public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame)
            {
                return VSConstants.S_OK;
            }
    
            public int OnAfterDocumentWindowHide(uint docCookie, IVsWindowFrame pFrame)
            {
                return VSConstants.S_OK;
            }
    
            public int OnAfterAttributeChangeEx(uint docCookie, uint grfAttribs, IVsHierarchy pHierOld, uint itemidOld, string pszMkDocumentOld, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)
            {
                return VSConstants.S_OK;
            }
    
            public int OnBeforeSave(uint docCookie)
            {
                /////// MY CODE ////////
                return VSConstants.S_OK;
            }
    
            #endregion Methods
        }
    }
    
        2
  •  0
  •   Weiwei    8 年前

    根据您的需求,您需要实现IVsSolutionEvents3,以获得加载/卸载项目的通知。并通过SVsSolutionBuildManager服务将该对象注册为包初始化代码中的侦听器。

    然后实现IVsHierarchyEvents以获得项目更改的通知,并在传递给IVsSolutionEvents3的OnAfterProjectOpen实现的IVsHierarchy对象上调用AdviseHierarchyEvents以注册事件侦听器对象。

    Visual Studio SDK - Handling File Add, Remove, and Rename Events

    推荐文章