У меня есть ручка для данного окна. Как я могу перечислить его дочерние окна?Как я могу получить дочерние окна окна, учитывая его HWND?
ответ
Я нашел, что лучшим решением является Managed WindowsAPI. У него был элемент управления CrossHair, который можно было использовать для выбора окна (а не части вопроса) и метода AllChildWindows для получения всех дочерних окон, которые, вероятно, завернули функцию EnumChildWindows. Лучше не изобретать велосипед.
Использование:.
internal delegate int WindowEnumProc(IntPtr hwnd, IntPtr lparam);
[DllImport("user32.dll")]
internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam);
вы получите обратные вызовы на функции вы передаете в
Использование EnumChildWindows, с р/вызова. Вот интересная ссылка о некоторых ее поведении: https://blogs.msdn.microsoft.com/oldnewthing/20070116-04/?p=28393
Если вы не знаете дескриптор окна, а только его название, вам нужно будет использовать EnumWindows. http://pinvoke.net/default.aspx/user32/EnumWindows.html
Вот управляемая альтернатива EnumWindows, но вам все равно нужно будет использовать EnumChildWindows, чтобы найти дескриптор дочернего окна.
foreach (Process process in Process.GetProcesses())
{
if (process.MainWindowTitle == "Title to find")
{
IntPtr handle = process.MainWindowHandle;
// Use EnumChildWindows on handle ...
}
}
Я пытаюсь сделать это, но нет главного окна для процесса. – Epu
Epu, если нет главного окна, тогда процесс не будет иметь обработчик окна для получения (т. Е. Process.MainWindowHandle == IntPtr.Zero). –
Here у вас есть рабочее решение:
public class WindowHandleInfo
{
private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);
private IntPtr _MainHandle;
public WindowHandleInfo(IntPtr handle)
{
this._MainHandle = handle;
}
public List<IntPtr> GetAllChildHandles()
{
List<IntPtr> childHandles = new List<IntPtr>();
GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles);
IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(this._MainHandle, childProc, pointerChildHandlesList);
}
finally
{
gcChildhandlesList.Free();
}
return childHandles;
}
private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
{
GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam);
if (gcChildhandlesList == null || gcChildhandlesList.Target == null)
{
return false;
}
List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>;
childHandles.Add(hWnd);
return true;
}
}
Как потребить его:
class Program
{
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
static void Main(string[] args)
{
Process[] anotherApps = Process.GetProcessesByName("AnotherApp");
if (anotherApps.Length == 0) return;
if (anotherApps[0] != null)
{
var allChildWindows = new WindowHandleInfo(anotherApps[0].MainWindowHandle).GetAllChildHandles();
}
}
}
как я могу получить user32.dll ?? – jai
@jai Это библиотека Windows, она уже присутствует и зарегистрирована на вашем компьютере. Этот код должен работать без необходимости дополнительных ссылок. –
спасибо @caffe .... Но на самом деле, если я использую user32.dll, приложение запрашивает какое-то разрешение ... где я не могу запустить приложение ... как я могу это решить ... – jai
- 1. JACOB получить HWND окна
- 2. Как я могу получить пиксель закрытого окна?
- 3. Как получить hWnd окна консоли WinCE?
- 4. Как получить hWnd окна, открытого ShellExecuteEx .. hProcess?
- 5. Как получить обработчик (HWND) для диалогового окна
- 6. В wx.Python, как я могу получить дескриптор окна (hwnd) для моего фрейма и установить его стиль?
- 7. Как я могу получить имя элемента управления Visual Basic, учитывая его HWND?
- 8. Как закрыть дочерние окна и все дочерние окна с шагом
- 9. Как я могу получить дескриптор окна объекта CWnd в Delphi?
- 10. WM_EX_TRANSPARENT не перерисовывает дочерние окна
- 11. Использование HWND для переключения окна
- 12. Как я могу получить название окна из его имени процесса?
- 13. как я могу получить содержимое окна для «обнимания» его подвид
- 14. Как я могу получить URL-адрес окна?
- 15. как я могу получить имя окна? [Python]
- 16. Как я могу получить экран окна UAC?
- 17. Как я могу получить содержимое окна редактирования, созданного в win32?
- 18. Как получить hWnd из окна редактирования, когда есть несколько?
- 19. Скользящие дочерние окна
- 20. Получить заголовок окна по его имя процесса без главного окна
- 21. C++ Изменение окна HWND во время выполнения
- 22. Как я могу получить дескриптор окна (hWnd) для этапа в JavaFX?
- 23. Как получить текст из окна с конкретным HWND?
- 24. Как можно получить HWND окна JavaFX в Java 9?
- 25. Как получить имя и идентификатор класса окна из HWND?
- 26. VB6/WinAPI: Как я могу получить hwnd из ListView.ListItem?
- 27. Как я могу получить HWND из String?
- 28. ClassName окна hwnd изменяется время от времени
- 29. Как я могу получить размер конкретного окна процесса?
- 30. Ускоренное расширение Firefox: получить собственный HWND-дескриптор окна браузера
В целом. Я могу получить HWND окна, из которого я хотел бы перечислить. –
Отлично - я обновил ваш вопрос, чтобы все было ясно. – Shog9
Предположим, вы знаете о spy ++. Полезный инструмент для работы с этим материалом. – David