Реализовать метод который будет находить дискриптор дочернего окна по заголовку используя EnumChildWindows - C#

Узнай цену своей работы

Формулировка задачи:

Помогите создать метод который будет находить дискриптор дочернего окна по заголовку используя EnumChildWindows.

Решение задачи: «Реализовать метод который будет находить дискриптор дочернего окна по заголовку используя EnumChildWindows»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
 
class Window
{
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
    delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);
 
    [DllImport("user32")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);
 
    [DllImport("user32.dll", SetLastError = true)]
    static extern int GetWindowTextLength(IntPtr hWnd);
 
    [DllImport("user32.dll", SetLastError = true)]
    static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
 
    [DllImport("user32.dll", SetLastError = true)]
    static extern int GetClassName(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
 
    static bool EnumWindow(IntPtr handle, IntPtr pointer)
    {
        GCHandle gch = GCHandle.FromIntPtr(pointer);
        List<IntPtr> list = gch.Target as List<IntPtr>;
        if (list == null)
            throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
 
        list.Add(handle);
        return true;
    }
 
    static List<IntPtr> GetChildWindows(IntPtr parent)
    {
        List<IntPtr> result = new List<IntPtr>();
        GCHandle listHandle = GCHandle.Alloc(result);
 
        try
        {
            EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
            EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
        }
        finally
        {
            if (listHandle.IsAllocated)
                listHandle.Free();
        }
        return result;
    }
 
    static string GetWindowText(IntPtr hWnd)
    {
        int len = GetWindowTextLength(hWnd) + 1;
        StringBuilder sb = new StringBuilder(len);
        len = GetWindowText(hWnd, sb, len);
 
        return sb.ToString(0, len);
    }
 
    static string GetWindowClass(IntPtr hWnd)
    {
        int len = 260;
        StringBuilder sb = new StringBuilder(len);
        len = GetClassName(hWnd, sb, len);
 
        return sb.ToString(0, len);
    }
 
    public static IntPtr get_hwnd_child_window_by_name(string WindowName, string ChildWindowName)
    {
        IntPtr hwnd_window = FindWindow(null, WindowName);
 
        List<IntPtr> all_hwnd_child_window = GetChildWindows(hwnd_window);
 
        foreach (var hwnd_child_window in all_hwnd_child_window)
        {
            if (GetWindowText(hwnd_child_window) == ChildWindowName)
            {
                return hwnd_child_window;
            }
        }
 
        return IntPtr.Zero;
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы