windows 获取类名子字符串匹配的窗口的句柄

thigvfpy  于 2022-11-26  发布在  Windows
关注(0)|答案(1)|浏览(202)

我试图获取一个窗口的句柄,但它的类名不幸地改变了(不是我的进程)。只有类名的第一部分保持不变(Afx:ControlBar:)。它也不是一个顶级进程,而是另一个窗口的子窗口。
我知道,对于类名的完整字符串匹配,我可以使用

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

我还知道,我可以使用FindWindowExchildAfter参数遍历_parentWindow的所有子窗口,但我不确定如何从返回的IntPtr对象中获取className。
是否有一种简单的方法可以从已知的className子字符串中获取所需的窗口句柄?

fnvucqvd

fnvucqvd1#

基于@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;
}

相关问题