可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
We work on several different branches of the same code, and when working on two branches at once, it can become confusing and time wasting.
Presently, the VS title bar has the text <solution-name> - Visual Studio
.
Is it possible for me to write an extension that will make that text <solution-name>: <branch-name> - <Visual Studio>
?
回答1:
I just created a small Visual Studio extension that can help:
http://visualstudiogallery.msdn.microsoft.com/f3f23845-5b1e-4811-882f-60b7181fa6d6
This small extension will detect
whenever two instances of Visual
Studio are running and change the
window title of Visual Studio to
include the parent folder name of the
solution. It will therefore change
SolutionFolder - Microsoft Visual Studio into
SolutionFolderParent\SolutionFolder - Microsoft Visual Studio.
This is particularly useful when
branching a solution: it becomes
possible to easily identify which
branch you are working on, in the case
where both would have the same
solution name.
Official page here:
http://erwinmayer.com/labs/visual-studio-2010-extension-rename-visual-studio-window-title/
回答2:
Check out latest release of VSCommands 2010 Lite. It introduced a feature called Friendly Solution Name where you can set up a regex pattern to extract branch name from folder structure and have it placed in Visual Studio main window title. More details: http://vscommands.com/releasenotes/3.6.8.0 and http://vscommands.com/releasenotes/3.6.9.0
MSDN Download Page
回答3:
Trying to set MainWindow.Caption throws an exception. You have to use the Win32 SetWindowText function to change the title, but beware: Visual Studio resets the title bar text at the drop of a hat, so you should implement a Timer to keep setting your desired text. The following code from the Connect
class of the add-in will permanently (or, as long as the add-in is running) keep the title bar text as "Hello World!"
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
resetTitleTimer = new Timer(new TimerCallback(SetMainWindowTitle), "Hello world!", 0, 10);
}
[DllImport("user32.dll")]
private static extern bool SetWindowText(IntPtr hWnd, string lpString);
private void SetMainWindowTitle(object state)
{
IntPtr hWnd = (IntPtr)_applicationObject.MainWindow.HWnd;
SetWindowText(hWnd, "Hello World!");
}
回答4:
I added a symbolic link with a different name targeting the solution file. Open the solution with the symbolic link and the window title has the symbolic link name.
In windows:
mklink BlawBranch.sln Blaw.sln
EDIT:
Found that a hard link breaks if target .sln file is updated by our source control. A symbolic link doesn't have the same problem.
回答5:
Just another extension to change the Visual Studio titlebar by defining it as an expression: http://visualstudiogallery.msdn.microsoft.com/2e8ebfe4-023f-4c4d-9b7a-d05bbc5cb239
The setup that makes use of a "title expression" makes this plugin quite flexible.
回答6:
To be honest, I am not sure I am understanding your question correctly, but I had asked one here on SO that seems to be about a similar problem:
Working with different versions/branches of the same Visual Studio 2005 solution
回答7:
Perhaps a simpler solution would be to use virtual desktops? Spacial arrangement is easier to remember, you could group any related windows with the corresponding VS, and switching would be simpler.
回答8:
there is a property by name AppName for any visual studio based IDE, that should do the trick.
回答9:
From http://www.helixoft.com/blog/archives/32 sets the title to the current filename. It also works on Visual Studio 10
Private timer As System.Threading.Timer
Private ideTitle As String = Nothing
Declare Auto Function SetWindowText Lib "user32" (ByVal hWnd As System.IntPtr, _
ByVal lpstring As String) As Boolean
'''<summary>Called when any window in VS gets activated.</summary>
'''<param name="GotFocus">Window that got focus.</param>
'''<param name="LostFocus">Window that lost focus.</param>
Private Sub WindowEvents_WindowActivated(ByVal GotFocus As EnvDTE.Window, ByVal LostFocus As EnvDTE.Window) Handles WindowEvents.WindowActivated
Try
If timer Is Nothing Then
' Create timer which refreshes the caption because
' IDE resets the caption very often
Dim autoEvent As New System.Threading.AutoResetEvent(False)
Dim timerDelegate As System.Threading.TimerCallback = _
AddressOf tick
timer = New System.Threading.Timer(timerDelegate, autoEvent, 0, 200)
End If
If GotFocus.Document Is Nothing Then
ideTitle = Nothing
Else
ideTitle = GotFocus.Document.FullName
showTitle(ideTitle)
End If
Catch ex As System.Exception
End Try
End Sub
''' <summary>Dispose the timer on IDE shutdown.</summary>
Public Sub DTEEvents_OnBeginShutdown() Handles DTEEvents.OnBeginShutdown
If Not timer Is Nothing Then
timer.Dispose()
End If
End Sub
'''<summary>Called by timer.</summary>
Public Sub tick(ByVal state As Object)
Try
If Not ideTitle Is Nothing Then
showTitle(ideTitle)
End If
Catch ex As System.Exception
End Try
End Sub
'''<summary>Shows the title in main window.</summary>
Private Sub showTitle(ByVal title As String)
SetWindowText(New System.IntPtr(DTE.MainWindow.HWnd), title & " - " & DTE.Name)
End Sub
回答10:
In 2012, you have to set System.Windows.Application.Current.MainWindow.Title
in order for this to work. This will update both the TaskBarItem title and the MainWindow title.
This is only possible from the main thread and since the title will get updated at various points by Visual Studio, you have to hook up to some events and reset it to whatever you wanted it to be (in my AddIn, I use some EnvDTE.SolutionEvents
among others).
Hope this helps.
回答11:
In the VS automation model there is
_DTE.MainWindow.Capation
which you could start with.
See http://msdn.microsoft.com/en-us/library/envdte._dte.mainwindow.aspx