QT:qt5调用打开exe程序并获取调用按钮控件实例2025.5.7

为实现在 VS2015 的 Qt 开发环境下打开外部 exe,列出其界面按钮控件的序号与文本名,然后点击包含特定文本的按钮控件。以下是更新后的代码:

cpp 复制代码
#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
#include <windows.h>
#include <QString>
#include <vector>

// 查找窗口句柄
HWND findWindowByTitle(const QString& title) {
    return FindWindow(nullptr, title.toStdWString().c_str());
}

// 枚举子窗口并收集按钮句柄
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {
    wchar_t className[256];
    GetClassNameW(hwnd, className, sizeof(className) / sizeof(wchar_t));
    if (wcscmp(className, L"Button") == 0) {
        std::vector<HWND>* buttons = reinterpret_cast<std::vector<HWND>*>(lParam);
        buttons->push_back(hwnd);
    }
    return TRUE;
}

// 模拟鼠标点击
void simulateClick(HWND hwnd, int x, int y) {
    PostMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
    PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(x, y));
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 启动外部 exe
    QProcess process;
    process.start("C:\\Path\\To\\YourProgram.exe");

    if (!process.waitForStarted()) {
        qDebug() << "Failed to start the external program.";
        return -1;
    }

    // 等待一段时间,让外部程序的窗口完全打开
    QThread::sleep(5);

    // 查找外部程序的主窗口
    HWND mainWindow = findWindowByTitle("Your Program Title");
    if (mainWindow == nullptr) {
        qDebug() << "Could not find the main window of the external program.";
        return -1;
    }

    // 枚举子窗口,收集按钮句柄
    std::vector<HWND> buttons;
    EnumChildWindows(mainWindow, EnumChildProc, reinterpret_cast<LPARAM>(&buttons));

    if (buttons.size() < 3) {
        qDebug() << "There are not enough buttons in the external program window.";
        return -1;
    }

    // 获取第 3 个按钮的句柄
    HWND targetButton = buttons[2];

    // 获取目标按钮的位置和大小
    RECT rect;
    GetWindowRect(targetButton, &rect);

    // 计算按钮中心位置
    int centerX = (rect.left + rect.right) / 2;
    int centerY = (rect.top + rect.bottom) / 2;

    // 模拟点击目标按钮
    simulateClick(targetButton, centerX - rect.left, centerY - rect.top);

    return a.exec();
}    

代码解释

  1. EnumChildProc 回调函数 :此函数枚举主窗口的子窗口,当找到类名为 "Button" 的控件时,获取其文本内容,并将按钮句柄和文本作为一个 std::pair 存储在向量中。
  2. 主函数流程
    • 使用 QProcess 启动外部 exe。
    • 等待一段时间,确保外部程序的窗口完全打开。
    • 查找外部程序的主窗口。
    • 调用 EnumChildWindows 枚举子窗口,收集按钮句柄和文本。
    • 列出所有按钮的序号和文本。
    • 查找包含特定文本的按钮。
    • 若找到目标按钮,计算其中心位置并模拟点击操作。

注意事项

  • 需将 "C:\\Path\\To\\YourProgram.exe" 替换为实际的外部可执行文件路径。
  • 需将 "Your Program Title" 替换为实际的外部程序窗口标题。
  • 需将 "Your Target Button Text" 替换为要点击的按钮的特定文本。
  • 等待时间(QThread::sleep(5))可根据外部程序的启动速度进行调整。
相关推荐
王燕龙(大卫)19 分钟前
递归下降算法
开发语言·c++·算法
西门吹雪@1321 小时前
阿里云服务器-centos部署定时同步数据库数据-dbswitch
服务器·数据库·阿里云
zhangzhangkeji1 小时前
QT6 源(82):阅读与注释日历类型 QCalendar,本类并未完结,儒略历,格里高利历原来就是公历,
qt
青出于兰1 小时前
C语言|函数的递归调用
c语言·开发语言
2401_858286111 小时前
CD36.【C++ Dev】STL库的string的使用 (下)
开发语言·c++·类和对象·string
星火撩猿1 小时前
OpenGl实战笔记(3)基于qt5.15.2+mingw64+opengl实现光照变化效果
笔记·qt·opengl·光照效果
sanx182 小时前
从零搭建体育比分网站完整步骤
java·开发语言
若水晴空初如梦2 小时前
QT聊天项目DAY09
开发语言·qt·bootstrap
auspicious航2 小时前
PostgreSQL 常用SQL操作命令
数据库·sql·postgresql
Ten peaches2 小时前
苍穹外卖(订单状态定时处理、来单提醒和客户催单)
java·数据库·sql·springboot