背景:
PyQt在使用中需要使用一下另外一个exe程序,需要嵌入一下
过程:
Qt实战11.进程窗口集成之假装写了个第三方软件 - Qt小罗 - 博客园 (cnblogs.com)
python操作windows窗口获取正在运行的窗口句柄_python使用句柄操作-CSDN博客
翻译成PyQt来说,
1.1:我们先拿程序exe的句柄号,
1.2:然后构造一个windows程序,
1.3:最后将windows程序转为widget
实现:
主程序源码:
import sys
import timeimport win32gui
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout
from PyQt5.QtGui import QWindow, QPalette
from PyQt5.QtCore import Qtimport win32gui# 存储句柄的地方
hwnd_list = []
def get_all_hwnd(hwnd, mouse):if (win32gui.IsWindow(hwnd)and win32gui.IsWindowEnabled(hwnd)and win32gui.IsWindowVisible(hwnd)):title = win32gui.GetWindowText(hwnd)temp_dict = {}temp_dict["window_name"] = titletemp_dict["window_hwnd"] = hwndhwnd_list.append(temp_dict)win32gui.EnumWindows(get_all_hwnd, 0)class MainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):container = QWidget(self)layout = QVBoxLayout(container)self.setCentralWidget(container)self.setWindowTitle('PyQt Embed External Exe Example')external_exe_win_id = 0for hwnd_dict in hwnd_list:if '微信' in hwnd_dict["window_name"]:# 替换为外部exe窗口的句柄external_exe_win_id = hwnd_dict['window_hwnd']print('句柄号为%s'%(external_exe_win_id))window = QWindow.fromWinId(external_exe_win_id)print(window)layout.addWidget(QWidget.createWindowContainer(window))if __name__ == '__main__':app = QApplication(sys.argv)mainWindow = MainWindow()mainWindow.show()sys.exit(app.exec_())
获取当前窗口句柄源码:
import win32guihwnd_list = []import win32guidef get_all_hwnd(hwnd, mouse):if (win32gui.IsWindow(hwnd)and win32gui.IsWindowEnabled(hwnd)and win32gui.IsWindowVisible(hwnd)):title = win32gui.GetWindowText(hwnd)temp_dict = {}temp_dict["window_name"] = titletemp_dict["window_hwnd"] = hwndhwnd_list.append(temp_dict)# print(f"窗口名称:{title},句柄号:{hwnd}")win32gui.EnumWindows(get_all_hwnd, 0)for hwnd in hwnd_list:print(hwnd)
# print(hwnd_list)
微信、cmd程序嵌入效果图:
窗口缩小测试:
窗口最大化测试:
坑点:
任务管理器的句柄号看起来在所贴出程序中没什么用