ฉันจะรับชื่อของหน้าต่างที่ใช้งานปัจจุบันโดยใช้ c # ได้อย่างไร


109

ฉันต้องการทราบวิธีคว้าชื่อหน้าต่างของหน้าต่างที่ใช้งานอยู่ปัจจุบัน (เช่นหน้าต่างที่มีโฟกัส) โดยใช้ C #


2
คุณพยายามตรวจสอบว่าหน้าต่างใดในแอปพลิเคชันของคุณมีโฟกัสหรือหน้าต่างใดของแอปพลิเคชันใดมีโฟกัส
Peder Rice

นี่คือstackoverflow.com/questions/2423234/…ที่เกี่ยวข้องดังนั้นหากคุณต้องการให้คลิกปุ่มก็ควรตรวจสอบให้แน่ใจว่าแบบฟอร์มของคุณไม่ได้โฟกัส
barlop

คำตอบ:


166

ดูตัวอย่างวิธีดำเนินการกับซอร์สโค้ดแบบเต็มได้ที่นี่:

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มีข้อมูลที่เกี่ยวข้อง
Greg D

3
newb note เพื่อให้มันทำงานusing System.Runtime.InteropServices; และตำแหน่งที่จะใส่ dll import และ static extern lines วางไว้ในชั้นเรียน
barlop

1
@smink วิธีรับหน้าต่างเบื้องหน้าที่ใช้งานอยู่สำหรับผู้ใช้เฉพาะ (สมมติว่ากระบวนการทำงานเป็นบริการ)
tchelidze

1
ไซต์ที่คุณเชื่อมโยงไม่พร้อมใช้งาน นี่คือ (อาจ) ที่เก็บถาวรของเว็บ: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
Piotrek

2
นอกจากนี้ฉันต้องการให้แอปของฉันได้รับการแจ้งเตือนทุกครั้งที่หน้าต่างเบื้องหน้าจะเปลี่ยนไป มีเหตุการณ์นั้นหรือไม่?
Piotrek

18

หากคุณกำลังพูดถึง WPF ให้ใช้:

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

หากแอปพลิเคชันทั้งหมดไม่ทำงาน (โปรแกรมอื่นมีโฟกัส) จะไม่มีหน้าต่างใดที่ตั้งค่า IsActive เป็น true
Todd

อันที่จริงอาจผิดในกรณีของฉันฉันพยายามเข้าถึงอาร์เรย์ของหน้าต่างบนเธรดที่ไม่ใช่ UI อย่างไรก็ตามโปรดดูสิ่งนี้ด้วยในกรณีที่ฉันยังถูก: social.msdn.microsoft.com/Forums/vstudio/en-US/…
ทอดด์

4

ห่วงมากกว่าและหาหนึ่งที่มีApplication.Current.Windows[]IsActive == true


11
สิ่งนี้จะใช้กับ Windows ในแอปพลิเคชัน. Net ปัจจุบันไม่ได้หรือไม่? ฉันคิดว่า d4nt ต้องการรับชื่อของหน้าต่างที่ใช้งานปัจจุบันบนเดสก์ท็อปไม่ว่าจะเป็นของแอปพลิเคชันใดก็ตาม
Quagmire


2

ขึ้นอยู่กับฟังก์ชัน 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;
}

รองรับอักขระ UTF8


0

หากเกิดกรณีที่คุณต้องการCurrent Active Form จากแอปพลิเคชัน 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.