Làm cách nào để lấy tiêu đề của cửa sổ đang hoạt động hiện tại bằng c #?


109

Tôi muốn biết cách lấy tiêu đề Cửa sổ của cửa sổ đang hoạt động hiện tại (tức là cửa sổ có tiêu điểm) bằng C #.


2
Bạn đang cố gắng xác định cửa sổ nào trong ứng dụng của mình có tiêu điểm hoặc cửa sổ nào của bất kỳ ứng dụng nào có tiêu điểm?
Peder Rice

đây là stackoverflow.com/questions/2423234/… có liên quan, vì vậy nếu bạn muốn nhấp vào nút để thực hiện điều đó thì bạn nên đảm bảo rằng biểu mẫu của bạn không tập trung.
barlop

Câu trả lời:


165

Xem ví dụ về cách bạn có thể làm điều này với mã nguồn đầy đủ tại đây:

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

Đã chỉnh sửa với nhận xét của @Doug McClean để có độ chính xác tốt hơn.



3
một lưu ý mới, để làm cho nó chạy, using System.Runtime.InteropServices; và là nơi đặt các dòng nhập dll và tĩnh extern. dán nó trong lớp
barlop

1
@smink Cách tải cửa sổ nền trước Hoạt động cho người dùng cụ thể (giả sử quá trình chạy dưới dạng dịch vụ).
tchelidze

Trang web bạn đã liên kết đến không có sẵn. Đây là (có thể) kho lưu trữ web của nó: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
Piotrek

2
Ngoài ra, tôi muốn ứng dụng của mình được thông báo mỗi khi cửa sổ nền trước thay đổi. Có sự kiện nào cho điều đó không?
Piotrek

18

Nếu bạn đang nói về WPF thì hãy sử dụng:

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

Nếu toàn bộ ứng dụng không hoạt động (chương trình khác có tiêu điểm), thì sẽ không có cửa sổ nào đặt IsActive thành true.
Todd

Trên thực tế, điều đó có thể sai, trong trường hợp của tôi, tôi đang cố truy cập vào mảng Cửa sổ trên một chuỗi không phải giao diện người dùng. Tuy nhiên, hãy xem điều này trong trường hợp tôi vẫn đúng: social.msdn.microsoft.com/Forums/vstudio/en-US/…
Todd

4

Lặp lại Application.Current.Windows[]và tìm một với IsActive == true.


11
Điều này sẽ không chỉ hoạt động cho các cửa sổ trong ứng dụng .Net hiện tại? Tôi nghĩ rằng d4nt muốn lấy tiêu đề của cửa sổ đang hoạt động hiện tại trên màn hình nền, bất kể nó thuộc về ứng dụng nào.
Đầm lầy,


2

Dựa trên chức năng GetForegroundWindow | Tài liệu Microsoft :

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

Nó hỗ trợ các ký tự UTF8.


0

Nếu xảy ra trường hợp bạn cần Biểu mẫu Hoạt động Hiện tại từ ứng dụng MDI của mình : (MDI- Giao diện Đa tài liệu).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;

-3

bạn có thể sử dụng lớp quy trình rất dễ dàng. sử dụng không gian tên này

using System.Diagnostics;

nếu bạn muốn tạo một nút để có được cửa sổ đang hoạt động.

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
Cái này sai. Nó sẽ hiển thị tiêu đề chương trình của bạn không phải của cửa sổ đang hoạt động hiện tại.
isHuman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.