Получить все элементы управления любого окна с их типами и значением - PullRequest
1 голос
/ 09 июля 2010

Мое приложение похоже на приложение Spy ++: я хочу иметь возможность автоматически получать все различные элементы управления активного окна (любого приложения) и их дочерних элементов, и для каждого элемента управления я хочу знать тип, имя,и значение (заголовок или текст).

Я использую приложение Windows C #.

Каково решение для итерации всех элементов управления окна переднего плана и их дочерних элементов (и т. д.)и получить имя, тип и значение?

Ответы [ 3 ]

4 голосов
/ 09 июля 2010

Для перечисления окон верхнего уровня используйте EnumWindows(), для получения их дочерних окон используйте EnumChildWindows().

Использование HWND s из перечисленияокно верхнего уровня со значением строки заголовка может быть прочитано через GetWindowText(), для других окон вы можете использовать сообщение WM_GETTEXT или, в зависимости от того, что именно вы хотите, сообщение, специфичное для класса Windows, такое как LB_GETTEXTдля списка.

RealGetWindowClass() предоставит вам класс windows.

Ссылка на API окна;http://msdn.microsoft.com/en-us/library/ff468919%28v=VS.85%29.aspx

0 голосов
/ 09 июля 2010

Существует ряд функций Win32 API, которые вы можете использовать для написания своей собственной программы Spy ++. Эта ссылка объясняет, как написать клон Spy ++ в Visual Basic. Я знаю, вы, вероятно, не используете Visual Basic, но этот документ показывает, как дублировать Spy ++ с помощью Win32 API. Не нужно много усилий переводить это на C #.

0 голосов
/ 09 июля 2010

Да, вам придется использовать Windows API, если это окно не является частью вашего текущего приложения.Это даст вам текущее активное окно:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;

public class MainClass

    // Declare external functions.
    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

    public static void Main() {
        int chars = 256;
        StringBuilder buff = new StringBuilder(chars);

        // Obtain the handle of the active window.
        IntPtr handle = GetForegroundWindow();

        // Update the controls.
        if (GetWindowText(handle, buff, chars) > 0)
        {
            Console.WriteLine(buff.ToString());
            Console.WriteLine(handle.ToString());
        }
    }
}

Оно использует функцию GetWindowText (), чтобы найти имя окна, поэтому я предполагаю, что не должно быть проблем с поиском других свойствокна, такие как элементы управления и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...