Получить дескриптор окна с совпадением подстроки имени класса

Я пытаюсь получить дескриптор окна, имя класса которого, к сожалению, меняется (не мой процесс). Только первая часть имени класса остается постоянной (Afx:ControlBar:). Это также не верхний процесс, а скорее подокно другого окна.

Я знаю, что для полного соответствия строки имени класса я мог бы использовать

var controlBar = FindWindowEx(_parentWindow, IntPtr.Zero, "Afx:ControlBar:ac39000", "");

И я также знаю, что я мог бы просто перебрать все дочерние окна _parentWindow, используя параметр childAfter FindWindowEx, но я не уверен, как получить className из возвращенного объекта IntPtr.

Есть ли простой способ получить желаемый дескриптор окна из известной подстроки className?

«но я не уверен, как получить className из возвращенного объекта IntPtr». Получив IntPtr дескриптор окна, вы можете использовать GetClassName() API , чтобы получить имя класса. Смотрите здесь для примера.

Idle_Mind 21.11.2022 17:53

Если вы знаете родителя, используйте EnumChildWindows для перечисления его дочерних элементов, в противном случае EnumWindows для перечисления окон верхнего уровня, а затем перечисления дочерних элементов. GetClassName чтобы вернуть класс каждого окна в перечисление.

Jonathan Potter 21.11.2022 21:19

Спасибо за полезные предложения, я разместил решение, которое нашел на основе ваших ответов

emilaz 23.11.2022 21:04
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
3
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на полезном примере, на который ссылается @Idle_Mind в комментариях, вот как я решил это, используя GetClassName().

private static string GetWindowClassName(IntPtr handle)
{
    var buffer = new StringBuilder(128);
    GetClassName(handle, buffer, buffer.Capacity);
    return buffer.ToString();
}

private IntPtr GetControlBar(IntPtr startPointer)
{
    while (true)
    {
        startPointer = FindWindowEx(_parentWindow, startPointer, null, "");
        var className = GetWindowClassName(startPointer);
        if (className.StartsWith("Afx:ControlBar")) return startPointer;
        // if we have iterated all windows,, break
        if (startPointer == IntPtr.Zero) break;
    }

    return IntPtr.Zero;
}

Другие вопросы по теме