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.