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 #.


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.


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

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.


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


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.


0

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

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;

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

2
Ini salah. Ini akan menunjukkan judul program Anda bukan dari jendela aktif saat ini.
isHuman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.