2010-12-14 8 views
6

C'è un modo per ottenere il puntatore HWnd alla finestra superiore di Visual Studio 2010 da un'estensione VSIX? (Vorrei cambiare il titolo della finestra).HWnd di Visual Studio 2010

risposta

3

Dato che ci sono buone possibilità che l'estensione VSIX sarà in esecuzione in-process con Visual Studio, si dovrebbe provare questo:

System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle 

(nota se si esegue questa operazione troppo presto, si otterrà VS Splash schermo ...)

3

Suppongo che vogliate farlo in modo programmatico in C#?

Avrete bisogno di definire questo P/Invoke all'interno della vostra classe:

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

quindi avere un po 'di codice simile al seguente:

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

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

Provando questo codice sul mio locale, sembra impostare il titolo della finestra, ma Visual Studio lo sovrascrive in molte condizioni: guadagna focus, entra/esce dalla modalità di debug ... Questo potrebbe essere problematico.

Nota: È possibile ottenere il titolo della finestra direttamente dall'oggetto Processo, ma non è possibile impostarlo.

+0

Grazie per l'informazione. Questo mi ha portato a una soluzione più semplice. Process.GetCurrentProcess(). MainWindowHandle –

+1

VS continuerà a scrivere sul titolo. È discusso qui: http://stackoverflow.com/questions/577188/how-to-change-the-title-bar-text-of-visual-studio –

3

È possibile utilizzare il EnvDTE API per ottenere il hWnd della finestra principale:

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

In Visual Studio 2010/2012, la finestra principale e la parte di controlli utente implementato usando WPF. Puoi immediatamente ottenere la finestra WPF della finestra principale e lavorarci. Ho scritto il seguente metodo di estensione per questo:

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