1. 首先查看窗口名称,找到需要内嵌exe程序的位置
  2. 通过新建子线程来运行exe程序,然后获取它的句柄,这样可以通过句柄来获取它的整个窗体
    注:句柄是动态分配的
  3. 开启线程获取句柄,通过句柄建立QWindow,再将它添加到QWidget中。

启动外部程序

1. QProcess

PySide2.QtCore.QProcess官网说明各个方法

waitForFinished是有必要的,需要等待窗口完全启动才行,不然集成不进去

2. subprocess

exePath = "C:\\Windows\\system32\\calc.exe"
subprocess.Popen(exePath)

3. system()函数

system()函数的作用是执行系统命令调用命令处理器来执行命令。

cmd = "C:\Windows\System32\calc.exe"
os.system(cmd)

阻塞进程,直到myApp程序结束

获取句柄

Win32API参考手册:
http://www.yfvb.com/help/win32sdk/index.htm?page=html/gn8s6y.htm

创建窗口后,创建函数返回唯一标识窗口的【窗口把手】.一个应用程序使用其他函数中的这个句柄将它们的动作引导到窗口。窗口句柄具有HWND数据类型。
Win32 API包含几个特殊的常量,可以替换某些功能中的窗口句柄。例如,应用程序可以使用SendMessageTimeout功能中的HWND_TOPMOST,SendMessage功能中的HWND_BROADCAST或MapWindowPoints功能中的HWND_DESKTOP。

1. FindWindow

使用FindWindow函数来发现系统中是否存在具有指定类名或窗口名称的窗口。如果存在这样的窗口,FindWindow返回窗口的句柄。

HWND FindWindow(LPCTSTR [lpClassName],    //指向类名的指针
LPCTSTR [lpWindowName]  //指向窗口名称的指针
);
  • lpClassName:指向指定类名的空值终止的字符串,或者是标识类名字符串的原子。如果这个参数是一个原子,它必须是由先前调用GlobalAddAtom函数创建的全局原子。原子,16位值,必须放在【lpClassName】的低位字中。高阶字必须为零。
  • lpWindowName:指向指定窗口名称(窗口标题)的以null结尾的字符串。如果此参数为NULL,则所有窗口名称都匹配。

返回值:
如果函数成功,则返回值是具有指定类名和窗口名称的窗口的句柄。
如果函数失败,返回值为NULL。

2. FindWindowEx

检索其类名和窗口名称与指定字符串匹配的窗口的句柄。该函数搜索子窗口,从给定的子窗口之后开始。

HWND FindWindowEx(HWND [hwndParent],  //处理父窗口
HWND [hwndChildAfter],  //处理子窗口
LPCTSTR [lpszClasspl],  //指向类名的指针
LPCTSTR [lpszWindow]    //指向窗口名称的指针
);
  • hwndParent:标识要搜索子窗口的父窗口。如果【hwndParent】为NULL,该函数将使用桌面窗口作为父窗口。该函数将在桌面的子窗口的窗口中进行搜索。
  • hwndChildAfter:标识子窗口。搜索从Z顺序中的下一个子窗口开始。【hwndChildAfter】必须是【hwndParent】的直接子窗口,而不仅仅是后代窗口。
  • lpszClasspl:指向指定类名的空值终止的字符串,或者是标识类名字符串的原子。如果这个参数是一个原子,它必须是由先前调用GlobalAddAtom函数创建的全局原子。原子,16位值必须放在【lpszClasspl】的低位字中;高阶字必须为零。
  • lpszWindow:指向指定窗口名称(窗口标题)的以null结尾的字符串。如果此参数为NULL,则所有窗口名称都匹配。

返回值:
如果函数成功,则返回值是具有指定类和窗口名称的窗口的句柄。
如果函数失败,返回值为NULL。

GetClassName:通过句柄获得窗口类名

检索指定窗口所属的类的名称。

int GetClassName(HWND [hWnd], //窗口的句柄
LPTSTR [lpClassName],   //类名的缓冲区地址
INT [nMaxCount] //缓冲区的大小,以字符为单位
);
  • hWnd:标识窗口,间接地标识窗口所属的类。
  • lpClassName:指向要接收类名字符串的缓冲区。
  • nMaxCount:指定【lpClassName】参数指向的缓冲区的长度(以字符为单位)。如果长度超过缓冲区,则类名字符串将被截断。
    返回值:
    如果函数成功,则返回值是复制到指定缓冲区的字符数。
    如果函数成功,则返回值是复制到指定缓冲区的字符数。
# 通过句柄获取窗口类名
def get_clasname(hwnd):clasname = win32gui.GetClassName(hwnd)print('窗口类名:%s' % (clasname))return clasname

GetWindowText:通过句柄获得标题

# 通过句柄获得标题
def get_title(hwnd):title = win32gui.GetWindowText(hwnd)print('窗口标题:%s' % (title))return title

通过句柄置顶窗口

# 通过句柄窗口置顶
win32gui.SetWindowPos('句柄值', win32con.HWND_TOPMOST, 0, 0, 0, 0,win32con.SWP_NOMOVE | win32con.SWP_NOACTIVATE | win32con.SWP_NOOWNERZORDER | win32con.SWP_SHOWWINDOW | win32con.SWP_NOSIZE)

通过句柄取消置顶窗口

# 通过句柄取消窗口置顶
def set_down(hwnd):win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST, 0, 0, 0, 0,win32con.SWP_SHOWWINDOW | win32con.SWP_NOSIZE | win32con.SWP_NOMOVE)
set_down("句柄值")

通过句柄将窗口放到最前面(非置顶)

# 通过句柄将窗口放到最前
win32gui.SetForegroundWindow("句柄值")

通过句柄获取窗口的定位

# 通过句柄获取窗口的左、上、右、下,位置
left, top, right, bottom = win32gui.GetWindowRect("句柄值")

获取当前最顶层的标题 GetForegroundWindow

title = win32gui.GetWindowText(win32gui.GetForegroundWindow())

建立QWindow并添加到QWidget

1. 获取QWindow、

创建QWindow:

[static] QWindow *QWindow::fromWinId(WId id)
window = QWindow.fromWinId(hwnd)

2. 获取代理QWidget

widget = QWidget.createWindowContainer(window)

3. 将代理QWidget添加到要添加的页面中

问题点

外部程序的启动需要时间,要确定在嵌入页面之前已经打开外部程序,确保可以通过FindWindow获取的句柄不为空。
在FindWindow前sleep几秒。

PySide2嵌入外部程序相关推荐

  1. Linux嵌入外部程序窗口,μClinux嵌入系统外部硬件设备快速调试||μClinux|

    μClinux嵌入系统外部硬件设备快速调试 摘要:为 了加快开发调试μClinux嵌入式系统的外部硬件设备,采用直接物理地址的设备访问方法,在μClinux嵌入式系统中实现了外部硬件设备的快速访问. ...

  2. Linux下 Qt界面程序嵌入另一个Qt界面程序_Qt应用嵌入外部进程窗口

    项目工程的实现,想要使用多个程序进行实现,在里面存在一定的调用的过程:调查的情况如下 Qt界面程序嵌入另一个Qt界面程序[Linux] Qt界面程序嵌入另一个Qt界面程序[Linux]_ptc321的 ...

  3. Pyside2中嵌入Matplotlib的绘图

    近期遇到一个需求,就是用PySide2做出一个GUI,并且要将后台使用Matplotlib绘制的图显示在界面上.自己琢磨了蛮久,网上也搜了不少资料,但都感觉参差不齐,所以就自己总结一下. 我们使用QG ...

  4. lua运行外部程序_在C语言程序中嵌入Lua脚本

    第一次知道Lua语言,是上个月在书城的时候,看到一本名为<魔兽世界编程宝典>的书.心想,魔兽世界还能编程?难道是自己编一个魔兽世界出来?翻开一看,原来是编写插件,用的是一种叫Lua的脚本语 ...

  5. QT打开外部程序并嵌入Qt界面

    一 启动程序 QT在运行的时候,要启动qws服务,如果用前面两种方法,运行的时候,要新开启一个qws,否则不能运行:而用第三种方法,则不需要再开启qws,它和主进程共用一个qws. 一.通过调用系统函 ...

  6. PySide2、nltk、wordcloud、gensim、sklearn、pyinstaller实现词嵌入可视化、绘制词云图、制作GUI并打包的踩坑总结

    最近有个英语词汇学的期末作业,老师说可以写论文也可以写一个小程序.作为一个学物理的兔子,当然选择写程序啦(误).不过其中遇到了不少坑,就来总结一下. 首先说一下这个程序的设计思路.其实就是做一个图形界 ...

  7. WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)

    原文:WPF中用于嵌入其他进程窗口的自定义控件(AppContainer) 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199 ...

  8. SSI——服务器端嵌入

    服务器端嵌入:Server Side Include,是一种类似于ASP的基于服务器的网页制作技术.大多数(尤其是基于Unix平台)的WEB服务器如Netscape Enterprise Server ...

  9. 无法嵌入互操作类型 请改用适用的接口_西门子COMOS软件开发定制学习7-嵌入谷歌浏览器内核...

    首先需要声明的是,本篇并非COMOS实用案例,只是希望借此让大家了解,如何使用微软的WPF和C#语言开发COMOS插件. 首先看下效果图 功能说明: 拖拽COMOS设备至定制的浏览器,自动根据设备的名 ...

  10. Duilib嵌入cef3,实现浏览器功能

    CEF3介绍: CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chro ...

最新文章

  1. MongoDB数据节点基础操作
  2. C语言【字符串数组交叉输出】
  3. 2019计算机科学与技术全日制调济,2019年华侨大学计算机科学与技术学院全日制学术型研究生调剂信息(第三批)...
  4. 基于libuv的TCP设计(二)
  5. selenium 示例_Selenium findElement和findElements示例
  6. sql 查询关联字段 最好取别名 不然会被第一个覆盖
  7. ZigBee协议栈解析
  8. linux下c编程常识
  9. linux与windows文件共享——samba
  10. 计算机显示10的负次方,我输入10的9次方在EXCEL里,为什么总变成日期了?怎么办/excel10的负次方怎么打...
  11. matlab中在xls单元格中填充颜色,!Excel中如何根据某一列的值对整行进行颜色填充?...
  12. js 函数传参改变div属性
  13. import * as用法
  14. 疑问代词which/what/who的用法
  15. PL/SQL字符串Spit,Clob打印
  16. matlab 数理统计,(完整版)Matlab概率论与数理统计
  17. 《爬虫爬 wallhaven.cc壁纸》
  18. ForkJoin框架源码分析(详细)
  19. 更新丨织信Informat V1.12:审批流通知支持移动端打开链接,一键实现快速审批
  20. java基于Springboot的幼儿园管理系统-计算机毕业设计

热门文章

  1. linux压缩zip下载,linux下wget下载文件到指定目录,解压zip文件,解压与压缩总结...
  2. 中望3D2022弹簧的设计
  3. 怎样裁剪照片大小尺寸?如何在线编辑图片?
  4. AutoCAD 2019 for mac汉化版
  5. 雷霄骅---巨星陨落
  6. Java + OpenCV 实现图片人脸检测
  7. winform日历控件
  8. 分层导航and隐藏导航
  9. DPDK Release 21.08
  10. xposed框架修改手机串号教程_xposed 入门之修改手机 IMEI