Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengenalpasti dan Menyenaraikan Semua Windows Kepunyaan Proses Tertentu Menggunakan C#?

Bagaimanakah Saya Boleh Mengenalpasti dan Menyenaraikan Semua Windows Kepunyaan Proses Tertentu Menggunakan C#?

Susan Sarandon
Susan Sarandonasal
2025-01-05 20:13:41268semak imbas

How Can I Identify and List All Windows Belonging to a Specific Process Using C#?

Mengenal pasti dan Menghitung Windows Proses Tertentu Menggunakan .NET

Mencari semua tetingkap yang dicipta oleh proses tertentu boleh menjadi tugas yang berharga untuk pelbagai tujuan. Menggunakan C#, ini boleh dicapai dengan cekap dengan memanfaatkan fungsi EnumThreadWindows.

Untuk memulakan, dapatkan ID proses (PID) aplikasi yang anda ingin senaraikan tetingkapnya. Seterusnya, panggil EnumThreadWindows untuk setiap utas kepunyaan proses. Fungsi ini menerima perwakilan panggil balik yang mengambil pemegang tetingkap sebagai parameter dan mengembalikan benar jika penghitungan harus diteruskan. Dalam perwakilan ini, tambahkan pemegang pada koleksi.

Berikut ialah kod C# untuk menghitung semua tetingkap kepunyaan proses:

delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
    IntPtr lParam);

static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
{
    var handles = new List<IntPtr>();

    foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
        EnumThreadWindows(thread.Id, 
            (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

    return handles;
}

Untuk menunjukkan penggunaannya, berikut ialah contoh kod yang menyenaraikan tetingkap proses explorer dan memaparkan tajuknya:

private const uint WM_GETTEXT = 0x000D;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, 
    StringBuilder lParam);

[STAThread]
static void Main(string[] args)
{
    foreach (var handle in EnumerateProcessWindowHandles(
        Process.GetProcessesByName("explorer").First().Id))
    {
        StringBuilder message = new StringBuilder(1000);
        SendMessage(handle, WM_GETTEXT, message.Capacity, message);
        Console.WriteLine(message);
    }
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengenalpasti dan Menyenaraikan Semua Windows Kepunyaan Proses Tertentu Menggunakan C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn