2010-12-14 20 views
6

¿Hay alguna manera de colocar el puntero HWnd en la ventana superior de Visual Studio 2010 desde una extensión VSIX? (Me gustaría cambiar el título de la ventana).HWnd of Visual Studio 2010

Respuesta

3

Puesto que hay buenas posibilidades de que su extensión VSIX se ejecuta en proceso con Visual Studio, debe intentar esto:

System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle 

(Tenga en cuenta si lo hace demasiado pronto, obtendrá VS Splash pantalla ...)

3

Supongo que quiere hacer esto programáticamente en C#?

Tendrá que definir esta P/Invoke dentro de su clase:

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

A continuación, tienen un código que es similar al siguiente:

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

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

Probando este código en mi local, parece establecer el título de la ventana, pero Visual Studio lo sobrescribe bajo muchas condiciones: gana foco, ingresa/abandona el modo de depuración ... Esto podría ser problemático.

Nota: Puede OBTENER el título de la ventana directamente desde el objeto Proceso, pero no puede configurarlo.

+0

Gracias por la información. Esto me llevó a una solución más simple. Process.GetCurrentProcess(). MainWindowHandle –

+1

VS seguirá escribiendo sobre el título. Se trata aquí: http://stackoverflow.com/questions/577188/how-to-change-the-title-bar-text-of-visual-studio –

3

puede utilizar el EnvDTE API para obtener el HWnd de la ventana principal:

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

En Visual Studio 2010/2012, la ventana principal y parte de los controles de usuario implementado usando WPF. Puede obtener inmediatamente la ventana WPF de la ventana principal y trabajar con ella. Escribí el siguiente método de extensión para esto:

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