Получить дескрипторы окна приложения
Вопрос
Я создаю приложение, которое для другого приложения 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;
}