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
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 ...)
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.
È 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;
}
Grazie per l'informazione. Questo mi ha portato a una soluzione più semplice. Process.GetCurrentProcess(). MainWindowHandle –
VS continuerà a scrivere sul titolo. È discusso qui: http://stackoverflow.com/questions/577188/how-to-change-the-title-bar-text-of-visual-studio –