HWnd Visual Studio 2010 - PullRequest
       45

HWnd Visual Studio 2010

6 голосов
/ 14 декабря 2010

Есть ли способ получить HWnd-указатель на верхнее окно Visual Studio 2010 из расширения VSIX? (Я хотел бы изменить заголовок окна).

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

Поскольку есть большие шансы, что ваше расширение VSIX будет работать внутри Visual Studio, попробуйте следующее:

System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle

(Обратите внимание, что если вы сделаете это слишком рано, вы получите VS Splash screen ...)

3 голосов
/ 09 декабря 2012

Вы можете использовать EnvDTE API , чтобы получить HWnd главного окна:

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

В Visual Studio 2010/2012 главное окно и часть пользовательских элементов управления реализованы с использованием WPF. Вы можете сразу же получить окно WPF главного окна и работать с ним. Для этого я написал следующий метод расширения:

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;
}
3 голосов
/ 14 декабря 2010

Я предполагаю, что вы хотите сделать это программно в C #?

Вам нужно будет определить этот P / Invoke внутри вашего класса:

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

Тогда есть некоторый код, которыйвыглядит примерно так:

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

Документ по процессу: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

Документ по P / Invoke: http://msdn.microsoft.com/en-us/library/aa288468%28VS.71%29.aspx

Попробовать этот код на моем локальном компьютере,кажется, что он устанавливает заголовок окна, но Visual Studio перезаписывает его при многих условиях: получает фокус, входит / выходит из режима отладки ... Это может быть хлопотно.

Примечание. Вы можете получить заголовок окна прямо изОбрабатывать объект, но вы не можете его установить.

...