You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用win32gui获取自身PyQt应用的窗口句柄?

获取PyQt应用自身窗口句柄的方法

你用win32gui的FindWindow找不到自身PyQt应用的窗口句柄,代码返回0,尝试winId()得到的是sip.voidptr对象,这里给你两个可行的解决办法:

方法一:直接转换winId()为窗口句柄

PyQt的winId()返回的是底层窗口的指针对象,直接转成整数就是Windows系统认可的HWND(窗口句柄),可以直接传给win32gui的相关函数使用。

修改你的代码如下:

import win32gui
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6 import uic

class GUI(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        uic.loadUi('window.ui', self)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = GUI()
    win.show()

    # 将winId()转换为整数,得到窗口句柄
    hwnd = int(win.winId())
    print("我的窗口句柄: ", hwnd)

    # 可以用win32gui验证,比如获取窗口标题
    window_title = win32gui.GetWindowText(hwnd)
    print("窗口标题: ", window_title)

    sys.exit(app.exec())

方法二:用正确的参数调用FindWindow

你之前用"QMainWindow"作为类名调用FindWindow失败,是因为Qt在Windows系统中注册的窗口类名并不是QMainWindow,而是类似Qt6QWindowIcon(依Qt版本不同有差异)的内部类名,无法直接通过这个类名定位。

如果非要用FindWindow,可以通过窗口标题来定位:

  1. 先给窗口设置明确的标题,比如在代码里调用win.setWindowTitle("My App"),或者确保UI文件里的窗口标题正确;
  2. 然后用标题作为FindWindow的第二个参数:
import win32gui
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6 import uic

class GUI(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        uic.loadUi('window.ui', self)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = GUI()
    # 设置明确的窗口标题,避免和其他窗口重复
    win.setWindowTitle("My App")
    win.show()

    # 通过标题查找窗口
    mywindow = win32gui.FindWindow(None, "My App")
    print("我的窗口句柄: ", mywindow)

    sys.exit(app.exec())

注意:用标题查找时要确保当前系统中没有其他同名窗口,否则可能返回错误的句柄。

内容的提问来源于stack exchange,提问作者YAWL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:15:38