Bagaimana cara mendapatkan judul jendela aktif saat ini menggunakan c #?

109

Saya ingin tahu bagaimana cara mengambil judul Jendela dari jendela yang sedang aktif (yaitu yang memiliki fokus) menggunakan C #.

d4nt
sumber
2
Apakah Anda mencoba menentukan jendela mana dalam aplikasi Anda yang memiliki fokus atau jendela aplikasi mana yang memiliki fokus?
Peder Rice
ini relevan stackoverflow.com/questions/2423234/… jadi jika Anda ingin mengklik tombol untuk melakukannya, sebaiknya pastikan formulir Anda tidak fokus.
barlop

Jawaban:

165

Lihat contoh bagaimana Anda dapat melakukan ini dengan kode sumber lengkap di sini:

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

Diedit dengan komentar @Doug McClean untuk kebenaran yang lebih baik.

Jorge Ferreira
sumber
7
Jangan lupa menjadi warga negara yang baik. blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx dan blogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx memiliki info yang relevan.
Greg D
3
catatan newb, untuk menjalankannya, using System.Runtime.InteropServices; dan kembali ke mana harus meletakkan impor dll dan garis eksternal statis. menempelkannya di dalam kelas
barlop
1
@smink Bagaimana cara mendapatkan jendela latar depan yang aktif untuk pengguna tertentu (katakanlah proses berjalan sebagai layanan).
tchelidze
Situs yang Anda tautkan tidak tersedia. Ini (mungkin) arsip webnya: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
Piotrek
2
Selain itu, saya ingin aplikasi saya diberi tahu setiap kali jendela latar depan berubah. Apakah ada acara untuk itu?
Piotrek
18

Jika Anda berbicara tentang WPF, gunakan:

 Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);
Skvettn
sumber
Jika seluruh aplikasi tidak aktif (program lain memiliki fokus), maka tidak ada jendela yang akan mengatur IsActive ke true.
Todd
Sebenarnya itu bisa salah, dalam kasus saya, saya mencoba mengakses array Window pada utas non-UI. Namun, lihat juga ini jika saya masih benar: social.msdn.microsoft.com/Forums/vstudio/en-US/…
Todd
4

Ulangi Application.Current.Windows[]dan temukan yang dengan IsActive == true.

shA.t
sumber
11
Bukankah ini hanya berfungsi untuk jendela di aplikasi .Net saat ini? Saya rasa d4nt ingin mendapatkan judul dari jendela aktif saat ini di desktop, tidak peduli aplikasi apa yang dimilikinya.
Quagmire
3

Gunakan API Windows. Panggil GetForegroundWindow().

GetForegroundWindow()akan memberi Anda pegangan (bernama hWnd) ke jendela aktif.

Dokumentasi: Fungsi GetForegroundWindow | Microsoft Docs

ine
sumber
2

Berdasarkan fungsi GetForegroundWindow | Microsoft Docs :

[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;
}

Ini mendukung karakter UTF8.

Mohammad Dayyan
sumber
0

Jika ternyata Anda memerlukan Formulir Aktif Saat Ini dari aplikasi MDI Anda : (MDI- Multi Document Interface).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;
Arthur Zennig
sumber
-3

Anda dapat menggunakan kelas proses dengan sangat mudah. gunakan namespace ini

using System.Diagnostics;

jika Anda ingin membuat tombol untuk mendapatkan jendela aktif.

private void button1_Click(object sender, EventArgs e)
    {            
       Process currentp = Process.GetCurrentProcess();
       TextBox1.Text = currentp.MainWindowTitle;  //this textbox will be filled with active window.
    }
B. Beshoo
sumber
2
Ini salah. Ini akan menunjukkan judul program Anda bukan dari jendela aktif saat ini.
isHuman