qt嵌入并控制外部程序

一、流程

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

cpp 复制代码
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、将鼠标键盘事件响应到具体坐标位置

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

二、程序

cpp 复制代码
==========================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_OBJECT

public:
    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";
	}

}
相关推荐
John_ToDebug4 小时前
深度解析 Chromium 浏览器 UI 刷新机制与 ThemeService 的核心作用
chrome·windows·ui
疋瓞7 小时前
C++_win_QT6学习《3》_结合qt项目开发学习git仓库相关知识
c++·qt·学习
繁华似锦respect9 小时前
C++ & Linux 中 GDB 调试与内存泄漏检测详解
linux·c语言·开发语言·c++·windows·算法
锡兰_CC9 小时前
无缝触达,卓越体验:开启openEuler世界的任意门
服务器·网络·数据库·c++·图像处理·qt·nginx
Source.Liu9 小时前
【LibreCAD】RS_Pen 类详解
qt·cad
油炸自行车11 小时前
【Qt】Qt Creator Debug模式提示“缺少 Windows CDB 调试器配套的扩展组件“”
开发语言·windows·qt
vortex511 小时前
从 Scoop 故障看 Windows 与 Linux 软硬链接与权限机制的底层差异
linux·运维·windows
我要升天!11 小时前
QT -- 网络编程
c语言·开发语言·网络·c++·qt
墨月白11 小时前
[QT]QList 相关接口
qt
GIS阵地11 小时前
Qt实现简易仪表盘
开发语言·c++·qt·pyqt·qgis·qt5·地理信息系统