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