如图,简单的几个功能。
操作步骤:
1.先打开弹窗(必须的);
2.输入对应的内容点击发送即可。
一点知识点:
1.主要还是靠windows自带的api实现
2.用到了系统回调函数遍历窗口
3.用到了剪贴板
4.用到了窗口前后台链接、激活窗口及恢复窗口
上代码头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <Windows.h>
#include <WinUser.h>
#include <QRegExpValidator>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void SetClipboard(CONST CHAR* pData,DWORD dLength);
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
主函数
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QRegExp regx("[1-9][0-9]+$");
QValidator *validator = new QRegExpValidator(regx, ui->lineEdit );
ui->lineEdit_2->setValidator(validator);//只能输入数字
//lineEdit的第一个数是1-9的,第二个数和之后的是0-9的
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()//发送按钮按下
{
QString q_str = ui->lineEdit->text();//获取标题文本
QByteArray str = ui->lineEdit_3->text().toLocal8Bit();//获取要发送的文本
if(str==""|| q_str=="")
{
QMessageBox::warning(this,"erro","请输入完整");
return ;
}
std::wstring wlpstr = q_str.toStdWString();
LPCWSTR lpcwStr = wlpstr.c_str();//格式转换
//HWND hwnd = FindWindow(NULL,L"文件传输助手");//找到桌面上窗口名叫"文件传输助手"的窗口,不转换是这个样子
HWND hwnd = FindWindow(NULL,lpcwStr);//寻找窗口
if(hwnd==0)
{
QMessageBox::warning(this,"erro","没找到窗口,请确认是否打开");
return ;
}
SetClipboard(str.data(),str.size());//自定义函数:将文本写到剪切板内
ShowWindow(hwnd, SW_FORCEMINIMIZE);//最小化窗口
ShowWindow(hwnd, SW_SHOWNORMAL);//激活并显示窗口
HWND HwndCur = GetForegroundWindow();//获取当前窗口的句柄
SetWindowPos(HwndCur,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);//窗口置顶,但不改变大小和坐标
/*可以不用下面这个,不删也许会用到*/
// DWORD dOnlyFlag = GetCurrentThreadId();//获取系统中当前线程唯一标识
// DWORD dMainThreadID = GetWindowThreadProcessId(HwndCur,NULL);//当前窗口主线程ID
// AttachThreadInput(dOnlyFlag,dMainThreadID,TRUE);//当前窗口和后台窗口连接起来,连接线程
ShowWindow(hwnd,SW_SHOWNORMAL);//窗口可能被最小化,那么恢复
// SetForegroundWindow(hwnd);//将创建指定窗口的线程设置到前台,并且激活该窗口
// AttachThreadInput(dOnlyFlag,dMainThreadID,FALSE);//释放连接
int i=ui->lineEdit_2->text().toInt();//获取要输入并发送次数
while(i--)
{
keybd_event(17,0,0,0);//ctrl
keybd_event(86,0,0,0);// v
keybd_event(17,0,KEYEVENTF_KEYUP,0);//按键释放
keybd_event(86,0,KEYEVENTF_KEYUP,0);//按键释放
keybd_event(13,0,0,0);//回车
keybd_event(13,0,KEYEVENTF_KEYUP,0);//按键释放
}
}
HGLOBAL sysTarget = 0;//系统对象
HLOCAL sysWCHAR = 0;//系统对象WCHAR
void MainWindow::SetClipboard(CONST CHAR* pData,DWORD dLength)//复制内容到剪切板
{
GlobalUnlock(sysTarget);//释放锁定的内存
GlobalFree(sysTarget);//释放内存对象
if(dLength==0)
dLength = strlen(pData);
if(OpenClipboard(NULL))//打开粘贴板后不能再使用
{
EmptyClipboard();//清空粘贴板
sysTarget = GlobalAlloc(GMEM_MOVEABLE,dLength+1);//在全局分配空间
if(sysTarget)
{
LPSTR mem = (LPSTR)GlobalLock(sysTarget);//锁定系统对象且返回第一个字节的指针
memcpy(mem,pData,dLength+1);//复制内容到对象指针
mem[dLength] = (TCHAR)0;//字符结束符,只有CHAR可以使用
SetClipboardData(CF_TEXT,sysTarget);//内存中的护具放入剪贴板用于CHAR
}
else
{
qDebug()<<"系统分配对象错误"<<GetLastError()<<endl;
}
CloseClipboard();//关闭粘贴板之后才能使用粘贴板
}
else
{
qDebug()<<"打开粘贴板错误!"<<endl;
}
}
百度过一些功能:防止忘记
ShowWindow:ShowWindow_百度百科
SetClipboardData:SetClipboardData_百度百科
SetWindowPos:SetWindowPos_百度百科
keybd_event:keybd_event_百度百科 虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn