**
更新时间: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));
持续更新