C # kullanarak geçerli etkin pencerenin başlığını nasıl alabilirim?


109

C # kullanarak o anki aktif pencerenin (yani odağa sahip olanın) Pencere başlığını nasıl alacağımı öğrenmek istiyorum.


2
Uygulamanızdaki hangi pencerenin odaklandığını veya herhangi bir uygulamanın hangi penceresinin odaklandığını belirlemeye mi çalışıyordunuz?
— Peder Rice

bu, ilgili stackoverflow.com/questions/2423234/… olduğundan, bunu yapmak için bir düğmeyi tıklamak istiyorsanız, formunuzun odaklanmamasını sağlamaya değer.
— barlop

Yanıtlar:


166

Bunu tam kaynak koduyla nasıl yapabileceğinize ilişkin örneğe buradan bakın:

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

Daha iyi doğruluk için @Doug McClean yorumlarıyla düzenlenmiştir .



3
bir newb notu, çalıştırmak using System.Runtime.InteropServices; ve dll içe aktarımını ve statik harici satırları nereye koyacağınızı yeniden. sınıf içinde yapıştırmak
— barlop

1
@smink Belirli bir kullanıcı için Aktif ön plan penceresi nasıl alınır (işlemin servis olarak çalıştığını varsayalım).
— tchelidze

1
Bağlandığınız site mevcut değil. İşte (muhtemelen) web arşivi: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
— Piotrek

2
Ayrıca, ön plandaki pencere her değiştiğinde uygulamamın bilgilendirilmesini istiyorum. Bunun için herhangi bir olay var mı?
— Piotrek

18

WPF hakkında konuşuyorsanız, şunu kullanın:

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

Tüm uygulama etkin değilse (başka bir programın odağı varsa), hiçbir pencerede IsActive true olarak ayarlanmayacaktır.
— Todd

Aslında bu yanlış olabilir, benim durumumda Windows dizisine UI olmayan bir iş parçacığında erişmeye çalışıyordum. Ancak yine de haklıysam bunu da görün: social.msdn.microsoft.com/Forums/vstudio/en-US/…
— Todd

4

Döngüleyin Application.Current.Windows[]ve olanı bulun IsActive == true.


11
Bu sadece mevcut .Net uygulamasındaki pencereler için işe yaramaz mı? Sanırım d4nt, hangi uygulamaya ait olursa olsun, masaüstünde mevcut aktif pencerenin başlığını almak istiyor.
— Quagmire


2

GetForegroundWindow işlevine dayalı | Microsoft Dokümanlar :

[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 karakterlerini destekler.


0

Böyle bir durumda MDI uygulamanızdan Geçerli Aktif Form'a ihtiyacınız varsa : ( MDI - Çoklu Belge Arayüzü).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;

-3

süreç sınıfını kullanabilirsiniz, çok kolaydır. bu ad alanını kullan

using System.Diagnostics;

aktif pencere almak için bir düğme yapmak istiyorsanız.

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
Bu yanlış. Mevcut aktif pencerenin değil, programınızın başlığını gösterecektir.
— isHuman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.