Як отримати заголовок поточного активного вікна за допомогою c #?


109

Мені хотілося б знати, як схопити назву Window поточного активного вікна (тобто того, на якому є фокус) за допомогою C #.


2
Ви намагалися визначити, яке вікно у вашій програмі має фокус чи яке вікно будь-якої програми має фокус?
Педер Райс

це стосується stackoverflow.com/questions/2423234/…, тому якщо ви хочете натиснути кнопку, щоб це зробити, то варто переконатися, що форма не фокусується.
барлоп

Відповіді:


165

Дивіться приклад того, як це можна зробити з повним вихідним кодом тут:

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
нота примітка, щоб змусити її працювати using System.Runtime.InteropServices; і знову куди поставити імпорт dll та статичні зовнішні лінії. обклеювання його у класі
барлоп

1
@smink Як отримати активне вікно переднього плану для конкретного користувача (скажімо, процес працює як сервіс).
tchelidze

Сайт, з яким ви пов’язані, недоступний. Ось (можливо) веб-архів цього веб-сайту: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
Piotrek

2
Крім того, я хочу, щоб мій додаток отримували повідомлення щоразу, коли вікно переднього плану буде змінюватися. Чи є для цього якась подія?
Піотрек

18

Якщо ви говорили про WPF, тоді використовуйте:

 Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);

Якщо вся програма не активна (інша програма має фокус), то жодне вікно не встановить IsActive на значення true.
Тодд

Насправді це може бути помилково, у моєму випадку я намагався отримати доступ до масиву Window на потоці, що не має інтерфейсу користувача. Тим НЕ менше, також побачити це в разі , якщо я до сих пір вірно: social.msdn.microsoft.com/Forums/vstudio/en-US / ...
Todd

4

Переведіть петлю Application.Current.Windows[]і знайдіть той, з яким IsActive == true.


11
Чи це не буде працювати тільки для Windows у поточному додатку .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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.