#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 IEnumerableFindWindows(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 IEnumerableFindWindowsWithText(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++:
Комментариев нет:
Отправить комментарий