列举;“真正的”;窗口和子窗口 我在C++中编写了一个小工具,它是在寻找Windows应用程序主窗口的某个子窗口(UI是用Qt编写的,但这不应该影响问题)。 #包括 #包括 #包括 #包括 #包括“MainWindow.h” #包括“ui_main window.h” 主窗口::主窗口(QWidget*父窗口): QMainWindow(父级), 用户界面(新用户界面::主窗口) { 用户界面->设置用户界面(此); } MainWindow::~MainWindow() { 删除用户界面; } void主窗口::addOutputLine(常量QString&line) { 用户界面->输出明文编辑->追加明文(行); } QString QStringFromPTCHAR(TCHAR*in) { #ifdef UNICODE 返回QString::fromUtf16((ushort*)in); #否则 在中返回QString::fromLocal8Bit((char*); #恩迪夫 } BOOL回调枚举子窗口(HWND windowHandle,LPARAM ui) { 主窗口*此ui=(主窗口*)ui; TCHAR缓冲区[4096]; 德沃德缓冲区大小; 零内存(缓冲区,sizeof(缓冲区)); bufferSize=sizeof(buffer)/sizeof(buffer[0]); GetWindowText(windowHandle、buffer、bufferSize); QString windowTitle=QStringFromPTCHAR(缓冲区); 如果(!windowTitle.isEmpty()&&IsWindow(windowHandle)==TRUE&&IsWindowVisible(windowHandle)==TRUE) { thisUi->addOutputLine(QString(“SUB-WIN:”)+windowTitle); } 返回TRUE; } BOOL回调枚举窗口(HWND windowHandle,LPARAM ui) { 主窗口*此ui=(主窗口*)ui; TCHAR缓冲区[4096]; 德沃德缓冲区大小; 零内存(缓冲区,sizeof(缓冲区)); bufferSize=sizeof(buffer)/sizeof(buffer[0]); GetWindowText(windowHandle、buffer、bufferSize); QString windowTitle=QStringFromPTCHAR(缓冲区); 如果(!windowTitle.isEmpty()&&IsWindow(windowHandle)==TRUE&&IsWindowVisible(windowHandle)==TRUE) { thisUi->addOutputLine(QString(“WIN:”)+windowTitle); EnumChildWindows(windowHandle、enumerateChildWindows、ui); } 返回TRUE; } void main window::在按钮上单击() { ui->outputPlainTextEdit->clear(); EnumDesktopWindows(0,enumerateWindows,(LPRAM)this); }

列举;“真正的”;窗口和子窗口 我在C++中编写了一个小工具,它是在寻找Windows应用程序主窗口的某个子窗口(UI是用Qt编写的,但这不应该影响问题)。 #包括 #包括 #包括 #包括 #包括“MainWindow.h” #包括“ui_main window.h” 主窗口::主窗口(QWidget*父窗口): QMainWindow(父级), 用户界面(新用户界面::主窗口) { 用户界面->设置用户界面(此); } MainWindow::~MainWindow() { 删除用户界面; } void主窗口::addOutputLine(常量QString&line) { 用户界面->输出明文编辑->追加明文(行); } QString QStringFromPTCHAR(TCHAR*in) { #ifdef UNICODE 返回QString::fromUtf16((ushort*)in); #否则 在中返回QString::fromLocal8Bit((char*); #恩迪夫 } BOOL回调枚举子窗口(HWND windowHandle,LPARAM ui) { 主窗口*此ui=(主窗口*)ui; TCHAR缓冲区[4096]; 德沃德缓冲区大小; 零内存(缓冲区,sizeof(缓冲区)); bufferSize=sizeof(buffer)/sizeof(buffer[0]); GetWindowText(windowHandle、buffer、bufferSize); QString windowTitle=QStringFromPTCHAR(缓冲区); 如果(!windowTitle.isEmpty()&&IsWindow(windowHandle)==TRUE&&IsWindowVisible(windowHandle)==TRUE) { thisUi->addOutputLine(QString(“SUB-WIN:”)+windowTitle); } 返回TRUE; } BOOL回调枚举窗口(HWND windowHandle,LPARAM ui) { 主窗口*此ui=(主窗口*)ui; TCHAR缓冲区[4096]; 德沃德缓冲区大小; 零内存(缓冲区,sizeof(缓冲区)); bufferSize=sizeof(buffer)/sizeof(buffer[0]); GetWindowText(windowHandle、buffer、bufferSize); QString windowTitle=QStringFromPTCHAR(缓冲区); 如果(!windowTitle.isEmpty()&&IsWindow(windowHandle)==TRUE&&IsWindowVisible(windowHandle)==TRUE) { thisUi->addOutputLine(QString(“WIN:”)+windowTitle); EnumChildWindows(windowHandle、enumerateChildWindows、ui); } 返回TRUE; } void main window::在按钮上单击() { ui->outputPlainTextEdit->clear(); EnumDesktopWindows(0,enumerateWindows,(LPRAM)this); },c++,winapi,C++,Winapi,目前,我的子窗口列表中还有很多其他UI元素,例如Inter的“导航栏”、“地址栏”、“地址组合控件”等 除了那些“真实”窗口(即带有边框、标题栏等)之外,是否有办法过滤掉所有窗口?一个简单的检查是过滤掉没有标题(和边框)的窗口,如下所示: BOOL CALLBACK enumerateChildWindows(HWND windowHandle, LPARAM ui) { LONG styles = GetWindowLong(windowHandle, GWL_STYLE);

目前,我的子窗口列表中还有很多其他UI元素,例如Inter的“导航栏”、“地址栏”、“地址组合控件”等


除了那些“真实”窗口(即带有边框、标题栏等)之外,是否有办法过滤掉所有窗口?

一个简单的检查是过滤掉没有标题(和边框)的窗口,如下所示:

BOOL CALLBACK enumerateChildWindows(HWND windowHandle, LPARAM ui)
{
    LONG styles = GetWindowLong(windowHandle, GWL_STYLE);

    if ((styles & WS_CHILD) == WS_CHILD && IsWindowVisible(windowHandle)
        thisUi->addOutputLine(QString("SUB-WIN: ") + windowTitle);

    return TRUE;
}

正如我所说,这个过滤器非常简单,但您可以改为检查
WS\u CAPTION
(假设您要查找的窗口有一个标题栏)。最后请注意:永远不要使用
IsWindow()
函数,这是非常危险的,因为您在这里枚举窗口也是无用的。

一个粗略的过滤器是检查标志:
(windowHandle,GWL_样式)
。解决方案很简单:正式指定组成“真实”窗口的功能,你有你想要的过滤器表达式。好吧,在我的例子中,我需要的是查看窗口样式的提示。当我正在寻找一个带有特定标题的子窗口时,“hasacaption”功能已经过时了。如果你正在寻找一个特定的(子)窗口,检查窗口类通常比检查特定的窗口样式更健壮。而且,由于您很可能要对您确定的窗口执行某些操作,因此将为更健壮的解决方案提供基础架构。这也适用于不包含本机窗口的Qt GUI。
BOOL CALLBACK enumerateChildWindows(HWND windowHandle, LPARAM ui)
{
    LONG styles = GetWindowLong(windowHandle, GWL_STYLE);

    if ((styles & WS_CHILD) == WS_CHILD && IsWindowVisible(windowHandle)
        thisUi->addOutputLine(QString("SUB-WIN: ") + windowTitle);

    return TRUE;
}