qt嵌入并控制外部程序

一、流程

1、调用Window接口模拟鼠标,键盘事件

POINT point;
LPPOINT lpppoint = &point;
GetCursorPos(lpppoint);//获取鼠标位置
SetCursorPos(point.x, point.y);//设置鼠标位置//鼠标左键按下
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0);//获取键盘状态
short s = GetKeyState(VK_SHIFT);//按键按下,注意:字母只有大写生效且会转换为小写,大写:先按shift再写字母,或按下capital键
//微软码表:https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);

2、嵌入外部程序

使用VS自带的调用Window接口获取外部程序

打开VS -》工具-》Spy++(+)

 键盘【Ctrl + F】-》查找窗口-》将工具拖拽到已打开的程序窗口,获取到标题、类,创建窗口时使用

3、将鼠标键盘事件响应到具体坐标位置

通过与定时器配合使用可以实现一些固定的自动化操作(*^▽^*)

二、程序

==========================ExternalAPPControl.h=======================
#pragma once#include <QtWidgets/QWidget>
#include "ui_ExternalAPPControl.h"#include <Windows.h>
#include <WinUser.h>
#include <windef.h>#include <qdebug.h>
#include <qprocess.h>
#include <qwindow.h>
#include <qsettings.h>enum LANGUAGE
{ENGLISH = 0,CHINA
};
enum CAPITAL
{SMALL = 0,BIG
};class ExternalAPPControl : public QWidget
{Q_OBJECTpublic:ExternalAPPControl(QWidget *parent = nullptr);~ExternalAPPControl();private slots:void slotBtnClicked();private:void loadSettings();void loadExternalApp();private:Ui::ExternalAPPControlClass ui;QProcess* m_process;QWindow* m_window;PROCESS_INFORMATION m_pi;
};==========================ExternalAPPControl.cpp=====================
#include "ExternalAPPControl.h"ExternalAPPControl::ExternalAPPControl(QWidget *parent): QWidget(parent)
{ui.setupUi(this);loadExternalApp();QObject::connect(ui.pushButton, &QPushButton::clicked, this, &ExternalAPPControl::slotBtnClicked);
}ExternalAPPControl::~ExternalAPPControl()
{//退出进程DWORD exitCode;TerminateProcess(m_pi.hProcess, exitCode);
}void ExternalAPPControl::slotBtnClicked()
{POINT point;LPPOINT lpppoint = &point;GetCursorPos(lpppoint);//QPoint lineEditPos = ui.lineEdit->mapToGlobal(QPoint(0, 0));qDebug() << "lineEditPos:" << lineEditPos;//SetCursorPos(lineEditPos.x(), lineEditPos.y());mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, lineEditPos.x(), lineEditPos.y(), 0, 0);//获取键盘状态short s = GetKeyState(VK_SHIFT);if (s == 0)//初始化一下输入法{keybd_event(VK_SHIFT, 0, 0, 0);keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);qDebug() << "english";}else if (s == 1){}//默认中文输入法//大写keybd_event(VK_CAPITAL, 0, 0, 0);keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);keybd_event(VK_CAPITAL, 0, 0, 0);keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);keybd_event(65, 0, 0, 0);keybd_event(65, 0, KEYEVENTF_KEYUP, 0);//小写keybd_event(VK_CAPITAL, 0, 0, 0);keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);keybd_event(65, 0, 0, 0);keybd_event(65, 0, KEYEVENTF_KEYUP, 0);keybd_event(VK_CAPITAL, 0, 0, 0);keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);//鼠标归位SetCursorPos(point.x, point.y);}void ExternalAPPControl::loadSettings()
{
}void ExternalAPPControl::loadExternalApp()
{QString cmd = "C:/SoftWare/Notepad++/notepad++.exe";STARTUPINFO si = { sizeof(si) };si.dwFlags = STARTF_USESHOWWINDOW;si.wShowWindow = true;bool ret = CreateProcess(NULL,(LPWSTR)cmd.toStdWString().c_str(),NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&m_pi);Sleep(1000);WId wid = (WId)FindWindow(L"Notepad++", L"新文件 1 - Notepad++");//获取窗口句柄,类名,标题m_window = QWindow::fromWinId(wid);if (m_window){QWidget* widget = QWidget::createWindowContainer(m_window, this, Qt::Widget);ui.widget_externalAPP->layout()->addWidget(widget);}else{qDebug() << "add external app error";}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/661984.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows php 安装 Memcached扩展、php缺失 Memcached扩展、Class ‘Memcached‘ not found

在Windows系统下如何安装 php Memcached 扩展 下载dll文件 pecl地址&#xff1a;https://pecl.php.net/package/memcached 根据版本进行选择 &#xff1a; 解压下载的文件后得到了这么样的文件结构&#xff1a; 配置 移动dll文件到相应文件位置 重点&#xff1a; libme…

React的useEffect

概念&#xff1a;useEffect是一个React Hook函数&#xff0c;组件渲染之后执行的函数 参数1是一个函数&#xff0c;可以把它叫做副作用函数&#xff0c;在函数内部可以放置要执行的操作参数2是一个数组&#xff08;可选参&#xff09;&#xff0c;在数组里放置依赖项&#x…

【自动化测试】使用MeterSphere进行接口测试

一、接口介绍二、接口测试的过程三、接口自动化测试执行自动化流程 四、接口之间的协议HTTP协议 五、 接口测试用例设计接口文档 六、使用MeterSphere创建接口测试创建接口定义设计接口测试用例 一、接口介绍 自动化测试按对象分为&#xff1a;单元测试、接口测试、UI测试等。…

拌合楼管理系统(十八)如何从一个winForm中的事件修改另外一个Form的控件的值

前言&#xff1a; 上篇讲述了如何手工调用海康的车牌识别摄像头进行拍照和识别车牌&#xff0c;我车牌识别的程序在应用的一个窗体&#xff0c;需要去更新另外一个窗体里面的lable中的内容为识别的车牌信息&#xff0c;同时还要写入到另外窗体的datagridview中。 一、实现效果 …

Java面试八股之Java中数组有没有length()方法?String呢?为什么?

Java中数组有没有length()方法&#xff1f;String呢&#xff1f;为什么&#xff1f; 数组&#xff1a; 数组没有名为length()的方法&#xff0c;但有一个属性叫做length。可以通过数组名直接访问这个属性来获取数组的长度&#xff08;即元素个数&#xff09;。这是一个整数值&…

翻译《The Old New Thing》 - How do I cover the taskbar with a fullscreen window?

How do I cover the taskbar with a fullscreen window? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050505-04/?p35703 Raymond Chen 2005年5月5日 如何用全屏窗口覆盖任务栏&#xff1f; 很多时候&#xff0c;人们总是想得太多。…

在Centos7上部署LDAP服务

安装ldap和设置自起 - 安装ldap yum install -y openldap-servers openldap-clients openldap openldap-devel compat-openldap openldap-servers-sql- 启动和开机自起 systemctl start slapd systemctl enable slapd- 查看服务是否安装成功 配置ldap - 创建第一个管理账号…

基于Springboot的音乐翻唱与分享平台

基于SpringbootVue的音乐翻唱与分享平台设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 音乐资讯 音乐翻唱 在线听歌 后台登录 后台首页 用户管理 音乐资讯管理…

【已解决】pandas读excel中长数字变成科学计数法的问题

pandas 读excel中的长数字时&#xff0c;即使excel中已经设置为文本&#xff0c;读进df后也会自动变成科学计数法。 在日常的数据分析和处理工作中&#xff0c;Excel和pandas是数据分析师们不可或缺的得力助手。然而&#xff0c;在使用pandas读取Excel文件时&#xff0c;我们有…

模型剪枝-Network Slimming算法分析

代码见文末 论文地址&#xff1a;Learning Efficient Convolutional Networks through Network Slimming ICCV 2017 Open Access Repository 1.概述 由于边缘设备的限制&#xff0c;在模型的部署中经常受到模型大小、运行内存、计算量的限制。之前的方法要么只能解决其中一个…

Linux基础part-5

1、Linux用户与用户组管理 1、用户是什么&#xff1f; 实现资源分派&#xff08;区分和管理系统资源的访问权限&#xff0c;将不同的资源分配给不同的用户&#xff09;实现认证pam和授权&#xff08;用户身份通常通过用户名和密码进行认证&#xff0c;认证成功后系统将授予用…

Flutter运行项目一直:running gradle task

大体原因就是访问国外的资源由于网络等原因导致访问失败&#xff0c;解决方法就是换成国内的源 修改项目的android/build.gradle 文件&#xff0c;将里面的 google() mavenCentral()替换为 maven {allowInsecureProtocol trueurl https://maven.aliyun.com/repository/googl…