Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как получить список окон Windows?

#c_sharp #windows #winforms


Приложение WinForms отображается в Windows как окно. Чтобы проверить, являются ли
 контролы также окнами Windows, надо каким-то образом получить информацию об окне приложения
и обо всех дочерних окнах.
Как это можно сделать на C#?
Т.е. нужен метод на C#, который на основе имени окна или номера процесса окна вернет
информацию об окне и вложенных окнах. 
Этот метод поможет дать точный ответ на вопрос возникший тут: форма/диалог/меню/всплывающее
окно/поиск кортаны (Win+S) - это окно или нет?
    


Ответы

Ответ 1



Для получения списка окон вам придется прибегнуть к WinApi функции EnumWindows. Описание к этой функции вы можете найти здесь. Полагаю вы хотите найти конкретное окошко, по этому прилагаю пример: [DllImport("user32.dll")] private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam); // Delegate to filter which windows to include public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); /// Get the text for the window pointed to by hWnd public static string GetWindowText(IntPtr hWnd) { int size = GetWindowTextLength(hWnd); if (size > 0) { var builder = new StringBuilder(size + 1); GetWindowText(hWnd, builder, builder.Capacity); return builder.ToString(); } return String.Empty; } /// Find all windows that match the given filter /// A delegate that returns true for windows /// that should be returned and false for windows that should /// not be returned public static IEnumerable FindWindows(EnumWindowsProc filter) { IntPtr found = IntPtr.Zero; List windows = new List(); EnumWindows(delegate(IntPtr wnd, IntPtr param) { if (filter(wnd, param)) { // only add the windows that pass the filter windows.Add(wnd); } // but return true here so that we iterate all windows return true; }, IntPtr.Zero); return windows; } /// Find all windows that contain the given title text /// The text that the window title must contain. public static IEnumerable FindWindowsWithText(string titleText) { return FindWindows((wnd, param) => GetWindowText(wnd).Contains(titleText)); } Применение: var windows = FindWindowsWithText("Notepad"); Для получения позиции курсора можно использовать WinAPI функцию GetCursorPos Использование: POINT p; if (GetCursorPos(&p)) { //позиция курсора: p.x p.y } Что бы определить позицию курсора внутри окна можно воспользоваться этой функцией: if (ScreenToClient(hwnd, &p)) { //p.x и p.y относительны вашего окна } Документация

Ответ 2



Возможно для вас подойдёт что-то вроде: using System.Diagnostics; ... Process[] ProcessesList = Process.GetProcesses(); Это список всех процессов. Теперь можно сделать так, чтобы получить заголовок окна: ProcessesList[i].MainWindowTitle; если что-то другое, то вы наверняка найдёте нужный метод на MSDN

Ответ 3



Обязательно ли делать это на C#? Есть же такая программа, как Spy++:

Комментариев нет:

Отправить комментарий