QT的QProcess启动外部程序并点击上面按钮

**

更新时间:2023-01-07

**

有时候程序需要与外部程序进行交互。就需要给外部程序发送数据或者是其他操作。
我这里用到了模拟点击,就先发这个,后面再补充其他。

启动方式有两种:
一种是QProcess执行cmd,一种是QProcess的启动。

第一种阻塞式:

执行cmd命令:

void Widget::readResult(int exitCode)//执行完成后返0
{
	qDebug()<<exitCode;
}
    //windows need "\\"
    //merge file    
    QProcess p(0);
    QString command = "copy /b "+ QDir::toNativeSeparators("E:\Desktop\a.txt");
    //p.start("cmd",QStringList()<<"/c"<<command);//带参
 	p.start("cmd",QStringList()<<"/c"<<"ipconfig");
 	connect(&p, SIGNAL(finished(int)), this, SLOT(readResult(int)));
    //QString command = "E:\\Desktop\\SDTools_boxed";
    //p.start(command);//这种方式会阻塞当前主窗口,等待关闭外部 子窗口后,主窗口恢复正常
    if(!p.waitForStarted(-1))
    {
        return -1;
    }
    if(!p.waitForFinished(-1))//-1代表不限制时间
    {
        return -2;
    }
    qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());

第二种分离式:

下面我先给标题的使用代码:
我用的startDetached和SendMessage完成的这个功能。
所需头文件windows.h和导入库
#pragma comment(lib,“User32.lib”)

#include <QCoreApplication>
#include <QProcess>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <QDebug>
#pragma comment(lib,"User32.lib")


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

    QProcess process;
    //分离式启动
    process.startDetached("F:/qtdemo/demo/aiModule/EasyEdge-win-x86/EasyEdge.exe");
    if(process.waitForStarted(5000))
    {
        qDebug()<<"start ok";
    }
	//需要等待几秒确保程序完全启动,否则会找不到句柄
	//我这是取巧,你们得自己测试时间,或者更改方式。
    Sleep(3000);

    //找到一个窗口句柄
    HWND h = FindWindow(NULL, TEXT("窗口名字"));
    if(h ==0)
    {
        qDebug()<<"not windows h";

    }else
    {
     	//找到一个控件按钮句柄
        HWND button = FindWindowEx(h,NULL,NULL, TEXT("控件名字"));
        if(button == 0)
        {
            qDebug()<<"not button";
        }else{
       	 	//发生点击事件
            SendMessage(button, BM_CLICK, 0, 0);
        }

    }
   



    return a.exec();
}

运行过程就是启动程序后,等待n秒,会去模拟点击外部程序上面的按钮。
实现了这个功能。(你们不要去做无聊的事情哈)

下面再给一些模拟鼠标键盘的简单使用方式:
具体要去msdn查看API
MSDN的sendmessage

这是鼠标的:例子有移动和点击抬起–要点击抬起才完成一个点击操作

void MouseMove(int x, int y)//鼠标移动到指定位置  
{
	double fScreenWidth = ::GetSystemMetrics(SM_CXSCREEN) - 1;//获取屏幕分辨率宽度  
	double fScreenHeight = ::GetSystemMetrics(SM_CYSCREEN) - 1;//获取屏幕分辨率高度  
	printf("%f\n", fScreenWidth);
	printf("%f\n", fScreenHeight);

	double fx = x * (65535.0f / fScreenWidth);
	double fy = y * (65535.0f / fScreenHeight);
	INPUT  Input = { 0 };
	Input.type = INPUT_MOUSE;
	Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
	Input.mi.dx = fx;
	Input.mi.dy = fy;
	SendInput(1, &Input, sizeof(INPUT));
}

void MouseLeftDown()//鼠标左键按下  
{
	INPUT  Input = { 0 };
	Input.type = INPUT_MOUSE;
	Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
	SendInput(1, &Input, sizeof(INPUT));
}

void MouseLeftUp()//鼠标左键放开  
{
	INPUT  Input = { 0 };
	Input.type = INPUT_MOUSE;
	Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
	SendInput(1, &Input, sizeof(INPUT));

}

键盘的:例子 win+D隐藏界面

	INPUT input[4];
	memset(input, 0, sizeof(input));
	input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;
	input[0].ki.wVk = input[3].ki.wVk = VK_LWIN;
	input[1].ki.wVk = input[2].ki.wVk = 'D';
	input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;

	SendInput(4, input, sizeof(INPUT));

持续更新

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值