Получить дескрипторы окон приложения

Я создаю приложение, которое дает другому приложению mainWindowhandle, которое собирает информацию о состоянии окна. У меня нет проблем со сбором информации о дочерних окнах, но я не могу получить доступ к другим открытым окнам приложения или даже к меню. Есть ли способ получить все дескрипторы окон приложения?


person user361526    schedule 04.05.2009    source источник
comment
Оцените это рабочее решение: stackoverflow.com/a/28055461/1274092   -  person Caffé    schedule 21.01.2015


Ответы (3)


Вы могли бы сделать то, что кажется Process.MainWindowHandle: использовать P / Invoke для вызова EnumWindows функция, которая вызывает метод обратного вызова для каждого окна верхнего уровня в системе.

В обратном вызове вызовите GetWindowThreadProcessId и сравните идентификатор процесса окна с Process.Id; если идентификаторы процессов совпадают, добавьте дескриптор окна в список.

person Tim Robinson    schedule 04.05.2009

Во-первых, вам нужно получить дескриптор главного окна приложения.

 [DllImport("user32.dll", SetLastError = true)]
 static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

 IntPtr hWnd = (IntPtr)FindWindow(windowName, null);

Затем вы можете использовать этот дескриптор для получения всех дочерних окон:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);

private 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;  
}   
person Mez    schedule 04.05.2009
comment
Мез проблема не в том, чтобы получить дочерние окна, я могу сделать это легко, я не могу добраться до других окон, кроме mainWindow и его дочерних элементов ... - person user361526; 05.05.2009
comment
Это работает для любого окна, а также для окон, не принадлежащих собственному приложению. Извините, если я неправильно понял ваш вопрос. - person Mez; 05.05.2009
comment
Откуда взялось EnumWindowProc? - person Matthieu Charbonnier; 19.05.2017
comment
Добавьте для этого объявление: частный делегат bool EnumWindowsProc (IntPtr hWnd, IntPtr lParam); - person luka; 20.04.2018
comment
EnumWindowProc childProc = новый EnumWindowProc (EnumWindow); это получить ошибку - person luka; 20.04.2018

    public void GetWindowHandles()
    {
        List<IntPtr> windowHandles = new List<IntPtr>();

        foreach (Process window in Process.GetProcesses())
        {
            window.Refresh();

            if (window.MainWindowHandle != IntPtr.Zero) 
            {
                windowHandles.Add(window.MainWindowHandle);
            }
        }
    }

Прочтите Это относительно того, почему мы вызываем метод обновления и проверяем, равен ли указатель нулю

person Jamisco    schedule 23.11.2020