Как получить заголовок текущего активного окна с помощью c #?

109

Я хотел бы знать, как получить заголовок окна текущего активного окна (то есть того, которое имеет фокус) с помощью C #.

d4nt
источник
2
Пытались ли вы определить, какое окно в вашем приложении имеет фокус или какое окно любого приложения имеет фокус?
Peder Rice
это актуально stackoverflow.com/questions/2423234/… поэтому, если вы хотите, чтобы для этого было нажатие кнопки, стоит убедиться, что ваша форма не фокусируется.
barlop

Ответы:

166

См. Пример того, как это можно сделать с полным исходным кодом здесь:

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

private string GetActiveWindowTitle()
{
    const int nChars = 256;
    StringBuilder Buff = new StringBuilder(nChars);
    IntPtr handle = GetForegroundWindow();

    if (GetWindowText(handle, Buff, nChars) > 0)
    {
        return Buff.ToString();
    }
    return null;
}

Отредактировано с комментариями @Doug McClean для большей корректности.

Хорхе Феррейра
источник
7
Не забывай быть хорошим гражданином. blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx и blogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx содержат соответствующую информацию.
Грег Д.
3
примечание newb, чтобы заставить его работать, using System.Runtime.InteropServices; и где разместить строки импорта dll и static extern. вставка в класс
barlop 04
1
@smink Как получить активное окно переднего плана для конкретного пользователя (скажем, процесс выполняется как служба).
tchelidze 06
1
Сайт, на который вы указали, недоступен. Вот (возможно) его веб-архив: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
Piotrek
2
Кроме того, я хочу, чтобы мое приложение получало уведомление при каждом изменении окна переднего плана. Есть ли для этого какое-нибудь мероприятие?
Piotrek
18

Если вы говорили о WPF, используйте:

 Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);
Скветтн
источник
Если все приложение не активно (фокус находится у другой программы), то для IsActive не будет установлено значение true ни в одном окне.
Тодд
На самом деле это могло быть неправильно, в моем случае я пытался получить доступ к массиву Window в потоке, отличном от пользовательского интерфейса. Однако посмотрите и на это, если я все еще прав: social.msdn.microsoft.com/Forums/vstudio/en-US/…
Тодд,
4

Переберитесь Application.Current.Windows[]и найдите тот, у которого есть IsActive == true.

shA.t
источник
11
Разве это не сработает только для окон в текущем приложении .Net? Я думаю, что d4nt хочет получить заголовок текущего активного окна на рабочем столе, независимо от того, какому приложению оно принадлежит.
Quagmire
2

На основе функции GetForegroundWindow | Документы Microsoft :

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowTextLength(IntPtr hWnd);

private string GetCaptionOfActiveWindow()
{
    var strTitle = string.Empty;
    var handle = GetForegroundWindow();
    // Obtain the length of the text   
    var intLength = GetWindowTextLength(handle) + 1;
    var stringBuilder = new StringBuilder(intLength);
    if (GetWindowText(handle, stringBuilder, intLength) > 0)
    {
        strTitle = stringBuilder.ToString();
    }
    return strTitle;
}

Он поддерживает символы UTF8.

Мохаммад Дайян
источник
0

Если случится так, что вам понадобится текущая активная форма из вашего приложения MDI : (MDI- Multi Document Interface).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;
Артур Зенниг
источник
-3

вы можете использовать класс процесса, это очень просто. используйте это пространство имен

using System.Diagnostics;

если вы хотите сделать кнопку, чтобы окно стало активным.

private void button1_Click(object sender, EventArgs e)
    {            
       Process currentp = Process.GetCurrentProcess();
       TextBox1.Text = currentp.MainWindowTitle;  //this textbox will be filled with active window.
    }
Б. Бешу
источник
2
Это не верно. Он покажет заголовок вашей программы, а не текущего активного окна.
isHuman