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
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 ...)
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.
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;
}
Danke für die Informationen. Dies führte mich zu einer einfacheren Lösung. Process.GetCurrentProcess(). MainWindowHandle –
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 –