2010-12-14 22 views

Odpowiedz

3

Ponieważ istnieją duże szanse, że rozszerzenie VSIX zostaną uruchomione w trakcie procesu z Visual Studio, należy spróbować tego:

System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle 

(Uwaga, jeśli zrobisz to zbyt wcześnie, dostaniesz VS Splash ekran ...)

3

Zakładam, że chcesz to zrobić programowo w C#?

Musisz określić to P/Invoke wewnątrz swojej klasie:

[DllImport("user32.dll")] 
static extern int SetWindowText(IntPtr hWnd, string text); 

Potem jakiś kod, który wygląda podobnie do następującego:

Process visualStudioProcess = null; 
//Process[] allProcesses = Process.GetProcessesByName("VCSExpress"); // Only do this if you know the exact process name 
// Grab all of the currently running processes 
Process[] allProcesses = Process.GetProcesses(); 
foreach (Process process in allProcesses) 
{ 
    // My process is called "VCSExpress" because I have C# Express, but for as long as I've known, it's been called "devenv". Change this as required 
    if (process.ProcessName.ToLower() == "vcsexpress" || 
     process.ProcessName.ToLower() == "devenv" 
     /* Other possibilities*/) 
    { 
     // We have found the process we were looking for 
     visualStudioProcess = process; 
     break; 
    } 
} 

// This is done outside of the loop because I'm assuming you may want to do other things with the process 
if (visualStudioProcess != null) 
{ 
    SetWindowText(visualStudioProcess.MainWindowHandle, "Hello World"); 
} 

Doc na proces: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

Doc na P/Wywołanie: http://msdn.microsoft.com/en-us/library/aa288468%28VS.71%29.aspx

Próbując tego kodu na moim lokalnym, wydaje się ustawić tytuł okna, ale Visual Studio nadpisuje go pod wieloma warunkami: zyskuje ostrość, wchodzi/opuszcza tryb debugowania ... To może być kłopotliwe.

Uwaga: Tytuł okna można pobrać bezpośrednio z obiektu Process, ale nie można go ustawić.

+0

Dzięki za informację. To doprowadziło mnie do prostszego rozwiązania. Process.GetCurrentProcess(). MainWindowHandle –

+1

VS będzie kontynuować pisanie nad tytułem. Jest to omówione tutaj: http://stackoverflow.com/questions/577188/how-to-change-the-title-bar-text-of-visual-studio –

3

można użyć EnvDTE API uzyskać hWND okna głównego:

var hwndMainWindow = (IntPtr) dte.MainWindow.HWnd; 

W Visual Studio 2010/2012, głównego okna i część kontroli użytkowników realizowane przy użyciu WPF. Możesz od razu uzyskać okno główne WPF i pracować z nim. W tym celu napisałem następującą metodę rozszerzenia:

public static Window GetWpfMainWindow(this EnvDTE.DTE dte) 
{ 
    if (dte == null) 
    { 
    throw new ArgumentNullException("dte"); 
    } 

    var hwndMainWindow = (IntPtr)dte.MainWindow.HWnd; 
    if (hwndMainWindow == IntPtr.Zero) 
    { 
    throw new NullReferenceException("DTE.MainWindow.HWnd is null."); 
    } 

    var hwndSource = HwndSource.FromHwnd(hwndMainWindow); 
    if (hwndSource == null) 
    { 
    throw new NullReferenceException("HwndSource for DTE.MainWindow is null."); 
    } 

    return (Window) hwndSource.RootVisual; 
}