Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

Сначала вам нужно получить дескриптор главного окна приложения.

 [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;  
}   
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top