QT实现外部窗口输入信息

 如图,简单的几个功能。

操作步骤:

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

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值