2010-12-14 26 views
6

Gibt es eine Möglichkeit, den HWnd-Zeiger von einer VSIX-Erweiterung auf das oberste Fenster von Visual Studio 2010 zu erhalten? (Ich möchte den Titel des Fensters ändern).HWnd von Visual Studio 2010

Antwort

3

Da es gute Chancen, dass Ihre VSIX Erweiterung wird im Prozess mit Visual Studio ausgeführt werden, sollten Sie dies versuchen:

System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle 

(Hinweis, wenn Sie dies noch zu früh zu tun, die Sie erhalten VS Splash Bildschirm ...)

3

Ich nehme an, Sie möchten dies in C# programmatisch tun?

Sie benötigen diese P/Invoke in Ihrer Klasse zu definieren:

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

dann einige Code, der dem folgenden ähnelt:

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 auf Prozess: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

Doc auf P/Invoke: http://msdn.microsoft.com/en-us/library/aa288468%28VS.71%29.aspx

Probieren Sie diesen Code auf meinem lokalen, es scheint, den Fenstertitel zu setzen, aber Visual Studio überschreibt es unter vielen Bedingungen: Gewinnt den Fokus, betritt/verlässt den Debug-Modus ... Dies könnte mühsam sein.

Hinweis: Sie können den Fenstertitel direkt aus dem Process-Objekt abrufen, aber Sie können ihn nicht festlegen.

+0

Danke für die Informationen. Dies führte mich zu einer einfacheren Lösung. Process.GetCurrentProcess(). MainWindowHandle –

+1

VS wird weiter über den Titel schreiben. Es wird hier diskutiert: http://stackoverflow.com/questions/577188/how-to-change-the-title-bar-text-of-visual-studio –

3

Sie die EnvDTE API können die HWnd des Hauptfensters erhalten: das Hauptfenster und ein Teil der Benutzersteuerungen

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

in Visual Studio 2010/2012, implementiert mit WPF. Sie können sofort das WPF-Fenster des Hauptfensters aufrufen und damit arbeiten. Ich schrieb die folgende Erweiterungsmethode dafür:

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; 
}