如何使用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,可以通过窗口标题来定位:
- 先给窗口设置明确的标题,比如在代码里调用
win.setWindowTitle("My App"),或者确保UI文件里的窗口标题正确; - 然后用标题作为
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
相关产品推荐
相关产品推荐

