다음을 통해 공유


작업 목록

Visual Studio작업 목록 사용자가 사용자 지정 프로그래밍 작업을 코드의 줄으로 연결 하 고 만들고, 작업 메시지의 사용자 지정 범주를 표시 하는 보기 작업 주석을 추가할 수 있습니다. 

명명 된 서비스를 통해 처리 되는 작업 SVsTaskList, 어떤 implements IVsTaskListIVsTaskList2. 기본 인증을 사용 하도록 작업 목록 기능을 만들어야 작업 공급자를 구현 하 여 IVsTaskProvider.

작업 공급자와 등록은 SVsTaskList 서비스를 호출 하 여 RegisterTaskProvider, 작업 공급자에서 모든 후속 트랜잭션 고유 하 게 식별 하는 데 쿠키 값을 반환 합니다.

모든 작업 공급자 구현 작업의 내부 목록을 유지 관리 하는 일을 담당 합니다. 작업 공급자를 호출할 수 있습니다 RefreshTasks 에서 작업 목록 표시 된 작업 목록을 업데이트할 수 있습니다. 이 경우에 발생 합니다.

  1. 서비스 공급자가 작업에 사용 하 여 콜백는 EnumTaskItems 메서드가 있습니다.

  2. 작업 공급자 구현 EnumTaskItems 반환 된 IVsEnumTaskItems 개체입니다.

  3. IVsEnumTaskItems 개체의 컬렉션을 통해 반복 IVsTaskItem 개체입니다.

  4. SVsTaskList 다음 업데이트 서비스는 작업 목록 표시 됩니다.

추가 기능을 사용할 수 있습니다. IVsTaskProvider3 인터페이스 마다 작업 공급자 열 고유한 사용자 지정 집합을 제공할 수 있습니다.

예제

다음 코드 예제에서는 작업 공급자 구현을 보여 줍니다.

Class TaskProvider 
    Implements ITaskProvider 
    Implements IVsSolutionEvents 
    Public Sub New(ByVal provider As IServiceProvider) 
        _imageList.ImageSize = New Size(9, 16) 
        _imageList.Images.AddStrip(Resources.priority) 
        _imageList.TransparentColor = Color.FromArgb(0, 255, 0) 
        _serviceProvider = provider 
        Dim taskList As IVsTaskList = TryCast(_serviceProvider.GetService(GetType(SVsTaskList)), IVsTaskList) 
        Dim hr As Integer = taskList.RegisterTaskProvider(Me, _cookie) 
        Debug.Assert(hr = VSConstants.S_OK, "RegisterTaskProvider did not return S_OK.") 
        Debug.Assert(_cookie <> 0, "RegisterTaskProvider did not return a nonzero cookie.") 
        
        SetCommandHandlers() 
        
        ListenForProjectUnload() 
    End Sub 
    
    #Region "ITaskProvider Members" 
    
    Public Sub AddResult(ByVal result As IScanResult, ByVal projectFile As String) 
        Dim fullPath As String = result.FilePath 
        If Not Path.IsPathRooted(fullPath) Then 
            fullPath = Utilities.AbsolutePathFromRelative(fullPath, Path.GetDirectoryName(projectFile)) 
        End If 
        
        If result.Scanned Then 
            For Each hit As IScanHit In result.Results 
                If hit.Warning IsNot Nothing AndAlso hit.Warning.Length > 0 Then 
                    ' See if we've warned about this term before; 
                    ' if so, don't warn again. 
                    If _termsWithDuplicateWarning.Find(Function(ByVal item As String) [String].Compare(item, hit.Term.Text, StringComparison.OrdinalIgnoreCase) = 0) Is Nothing Then 
                        _tasks.Add(New Task(hit.Term.Text, hit.Term.Severity, hit.Term.[Class], hit.Warning, "", "", _ 
                        -1, -1, "", "", Me, _serviceProvider)) 
                        _termsWithDuplicateWarning.Add(hit.Term.Text) 
                    End If 
                End If 
                
                _tasks.Add(New Task(hit.Term.Text, hit.Term.Severity, hit.Term.[Class], hit.Term.Comment, hit.Term.RecommendedTerm, fullPath, _ 
                hit.Line, hit.Column, projectFile, hit.LineText, Me, _serviceProvider)) 
            Next 
        Else 
            _tasks.Add(New Task("", 1, "", [String].Format(CultureInfo.CurrentUICulture, Resources.FileNotScannedError, fullPath), "", fullPath, _ 
            -1, -1, projectFile, "", Me, _serviceProvider)) 
        End If 
        Refresh() 
    End Sub 
    
    Public Sub Clear() 
        _tasks.Clear() 
        Refresh() 
    End Sub 
    
    Public Sub SetAsActiveProvider() 
        Dim taskList As IVsTaskList2 = TryCast(_serviceProvider.GetService(GetType(SVsTaskList)), IVsTaskList2) 
        Dim ourGuid As Guid = _providerGuid 
        Dim hr As Integer = taskList.SetActiveProvider(ourGuid) 
        Debug.Assert(hr = VSConstants.S_OK, "SetActiveProvider did not return S_OK.") 
    End Sub 
    
    Public Sub ShowTaskList() 
        Dim shell As IVsUIShell = TryCast(_serviceProvider.GetService(GetType(SVsUIShell)), IVsUIShell) 
        Dim dummy As Object = Nothing 
        Dim cmdSetGuid As Guid = VSConstants.GUID_VSStandardCommandSet97 
        Dim hr As Integer = shell.PostExecCommand(cmdSetGuid, CInt(VSConstants.VSStd97CmdID.TaskListWindow), 0, dummy) 
        Debug.Assert(hr = VSConstants.S_OK, "SetActiveProvider did not return S_OK.") 
    End Sub 
    
    ''' <summary> 
    ''' Returns an image index between 0 and 2 inclusive corresponding 
    ''' to the specified severity. 
    ''' </summary> 
    Public Shared Function GetImageIndexForSeverity(ByVal severity As Integer) As Integer 
        Return Math.Max(1, Math.Min(3, severity)) - 1 
    End Function 
    
    Public ReadOnly Property IsShowingIgnoredInstances() As Boolean 
        Get 
            Return _showingIgnoredInstances 
        End Get 
    End Property 
    
    #End Region 
    
    #Region "IVsTaskProvider Members" 
    
    Public Function EnumTaskItems(ByRef ppenum As IVsEnumTaskItems) As Integer 
        ppenum = New TaskEnumerator(_tasks, IsShowingIgnoredInstances) 
        Return VSConstants.S_OK 
    End Function 
    
    <DllImport("comctl32.dll")> _ 
    Private Shared Function ImageList_Duplicate(ByVal original As IntPtr) As IntPtr 
    End Function 
    
    Public Function ImageList(ByRef phImageList As IntPtr) As Integer 
        phImageList = ImageList_Duplicate(_imageList.Handle) 
        Return VSConstants.S_OK 
    End Function 
    
    Public Function OnTaskListFinalRelease(ByVal pTaskList As IVsTaskList) As Integer 
        If (_cookie <> 0) AndAlso (pTaskList IsNot Nothing) Then 
            Dim hr As Integer = pTaskList.UnregisterTaskProvider(_cookie) 
            Debug.Assert(hr = VSConstants.S_OK, "UnregisterTaskProvider did not return S_OK.") 
        End If 
        
        Return VSConstants.S_OK 
    End Function 
    
    Public Function ReRegistrationKey(ByRef pbstrKey As String) As Integer 
        pbstrKey = "" 
        Return VSConstants.E_NOTIMPL 
    End Function 
    
    Public Function SubcategoryList(ByVal cbstr As UInteger, ByVal rgbstr As String(), ByRef pcActual As UInteger) As Integer 
        pcActual = 0 
        Return VSConstants.E_NOTIMPL 
    End Function 
End Class
class TaskProvider : ITaskProvider, IVsSolutionEvents
{
    public TaskProvider(IServiceProvider provider)
    {
        _imageList.ImageSize = new Size(9, 16);
        _imageList.Images.AddStrip(Resources.priority);
        _imageList.TransparentColor = Color.FromArgb(0, 255, 0);
        _serviceProvider = provider;
        IVsTaskList taskList = _serviceProvider.GetService(typeof(SVsTaskList)) as IVsTaskList;
        int hr = taskList.RegisterTaskProvider(this, out _cookie);
        Debug.Assert(hr == VSConstants.S_OK, "RegisterTaskProvider did not return S_OK.");
        Debug.Assert(_cookie != 0, "RegisterTaskProvider did not return a nonzero cookie.");

        SetCommandHandlers();

        ListenForProjectUnload();
    }

    #region ITaskProvider Members

    public void AddResult(IScanResult result, string projectFile)
    {
        string fullPath = result.FilePath;
        if (!Path.IsPathRooted(fullPath))
        {
            fullPath = Utilities.AbsolutePathFromRelative(fullPath, Path.GetDirectoryName(projectFile));
        }

        if (result.Scanned)
        {
            foreach (IScanHit hit in result.Results)
            {
                if (hit.Warning != null && hit.Warning.Length > 0)
                {
                    // See if we've warned about this term before; 
                    // if so, don't warn again.
                    if (null == _termsWithDuplicateWarning.Find(
                        delegate(string item)
                        {
                           return String.Compare(item, hit.Term.Text, 
                             StringComparison.OrdinalIgnoreCase) == 0;
                        }))
                    {
                     _tasks.Add(new Task(hit.Term.Text, 
                      hit.Term.Severity, hit.Term.Class, hit.Warning, 
                      "", "", -1, -1, "", "", this, _serviceProvider));
                        _termsWithDuplicateWarning.Add(hit.Term.Text);
                    }
                }

                _tasks.Add(new Task(hit.Term.Text, hit.Term.Severity,
 hit.Term.Class, hit.Term.Comment, hit.Term.RecommendedTerm, fullPath,
 hit.Line, hit.Column, projectFile, hit.LineText, this,
 _serviceProvider));
            }
        }
        else
        {
            _tasks.Add(new Task("", 1, "", String.Format(CultureInfo.CurrentUICulture, 
Resources.FileNotScannedError, fullPath), "", fullPath, -1, -1, 
projectFile, "", this, _serviceProvider));
        }
        Refresh();
    }

    public void Clear()
    {
        _tasks.Clear();
        Refresh();
    }

    public void SetAsActiveProvider()
    {
        IVsTaskList2 taskList = _serviceProvider.GetService(typeof(SVsTaskList)) as IVsTaskList2;
        Guid ourGuid = _providerGuid;
        int hr = taskList.SetActiveProvider(ref ourGuid);
        Debug.Assert(hr == VSConstants.S_OK, 
          "SetActiveProvider did not return S_OK.");
    }

    public void ShowTaskList()
    {
        IVsUIShell shell = _serviceProvider.GetService(typeof(SVsUIShell)) as IVsUIShell;
        object dummy = null;
        Guid cmdSetGuid = VSConstants.GUID_VSStandardCommandSet97;
        int hr = shell.PostExecCommand(ref cmdSetGuid, (int)VSConstants.VSStd97CmdID.TaskListWindow, 0, ref dummy);
        Debug.Assert(hr == VSConstants.S_OK, "SetActiveProvider did not return S_OK.");
    }

    /// <summary>
    /// Returns an image index between 0 and 2 inclusive corresponding 
    /// to the specified severity.
    /// </summary>
    public static int GetImageIndexForSeverity(int severity)
    {
        return Math.Max(1, Math.Min(3, severity)) - 1;
    }

    public bool IsShowingIgnoredInstances
    {
        get { return _showingIgnoredInstances; }
    }

    #endregion

    #region IVsTaskProvider Members

    public int EnumTaskItems(out IVsEnumTaskItems ppenum)
    {
        ppenum = new TaskEnumerator(_tasks, IsShowingIgnoredInstances);
        return VSConstants.S_OK;
    }

    [DllImport("comctl32.dll")]
    static extern IntPtr ImageList_Duplicate(IntPtr original);

    public int ImageList(out IntPtr phImageList)
    {
        phImageList = ImageList_Duplicate(_imageList.Handle);
        return VSConstants.S_OK;
    }

    public int OnTaskListFinalRelease(IVsTaskList pTaskList)
    {
        if ((_cookie != 0) && (null != pTaskList))
        {
            int hr = pTaskList.UnregisterTaskProvider(_cookie);
            Debug.Assert(hr == VSConstants.S_OK, "UnregisterTaskProvider did not return S_OK.");
        }

        return VSConstants.S_OK;
    }

    public int ReRegistrationKey(out string pbstrKey)
    {
        pbstrKey = "";
        return VSConstants.E_NOTIMPL;
    }

    public int SubcategoryList(uint cbstr, string[] rgbstr, 
       out uint pcActual)
    {
        pcActual = 0;
        return VSConstants.E_NOTIMPL;
    }
}

참고 항목

작업

방법: 작업 목록의 사용자 지정 범주 만들기

참조

<Pave Over> 작업 목록(Visual Studio)

개념

작업 목록의 사용자 지정 보기 만들기