Я пытаюсь получить дескриптор окна, имя класса которого, к сожалению, меняется (не мой процесс). Только первая часть имени класса остается постоянной (Afx:ControlBar:). Это также не верхний процесс, а скорее подокно другого окна.
Я знаю, что для полного соответствия строки имени класса я мог бы использовать
var controlBar = FindWindowEx(_parentWindow, IntPtr.Zero, "Afx:ControlBar:ac39000", "");
И я также знаю, что я мог бы просто перебрать все дочерние окна _parentWindow, используя параметр childAfter FindWindowEx, но я не уверен, как получить className из возвращенного объекта IntPtr.
Есть ли простой способ получить желаемый дескриптор окна из известной подстроки className?
Если вы знаете родителя, используйте EnumChildWindows для перечисления его дочерних элементов, в противном случае EnumWindows для перечисления окон верхнего уровня, а затем перечисления дочерних элементов. GetClassName чтобы вернуть класс каждого окна в перечисление.
Спасибо за полезные предложения, я разместил решение, которое нашел на основе ваших ответов
Основываясь на полезном примере, на который ссылается @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;
}
«но я не уверен, как получить className из возвращенного объекта IntPtr». Получив IntPtr дескриптор окна, вы можете использовать GetClassName() API , чтобы получить имя класса. Смотрите здесь для примера.