2010-12-14 8 views
6

Existe-t-il un moyen d'obtenir le pointeur HWnd à la fenêtre supérieure de Visual Studio 2010 à partir d'une extension VSIX? (Je voudrais changer le titre de la fenêtre).HWnd de Visual Studio 2010

Répondre

3

Comme il y a de bonnes chances que votre extension VSIX sera en cours d'exécution en cours avec Visual Studio, vous devriez essayer ceci:

System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle 

(Notez que si vous le faites trop tôt, vous aurez VS Splash écran ...)

3

Je suppose que vous voulez faire cela par programmation en C#?

Vous devez définir ce P/Invoke dans votre classe:

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

Ensuite, ont un code qui ressemble à ce qui suit:

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

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

En essayant ce code sur mon ordinateur local, il semble définir le titre de la fenêtre, mais Visual Studio l'écrase dans de nombreuses conditions: gagne le focus, entre/quitte le mode de débogage ... Cela peut être gênant.

Remarque: Vous pouvez obtenir le titre de la fenêtre directement à partir de l'objet Process, mais vous ne pouvez pas le définir.

+0

Merci pour l'information. Cela m'a conduit à une solution plus simple. Process.GetCurrentProcess(). MainWindowHandle –

+1

VS continuera à écrire sur le titre. Il est discuté ici: http://stackoverflow.com/questions/577188/how-to-change-the-title-bar-text-of-visual-studio –

3

Vous pouvez utiliser le EnvDTE API pour obtenir le hWnd de la fenêtre principale:

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

Dans Visual studio 2010/2012, la fenêtre principale et une partie des contrôles utilisateur implémenté en utilisant WPF. Vous pouvez immédiatement obtenir la fenêtre WPF de la fenêtre principale et travailler avec. J'ai écrit la méthode d'extension suivante pour cela:

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