如何将QT窗口从其他进程最小化到系统托盘中?

时间:2017-06-08 10:13:01

标签: python qt winapi pyside

这是大系统中的一个功能。我们将问题简化为下面的示例代码。

在示例中,我们可以点击"隐藏"在隐藏任务栏按钮的情况下将窗口最小化到系统托盘中。如果我们单击托盘按钮,则隐藏窗口可以再次显示。

我们希望实现该功能:当一个实例启动并且窗口已最小化到系统托盘中时,我们启动另一个实例(使用相同的脚本),然后新实例激活旧实例的窗口,展示回来。

新实例使用FindWindow API获取窗口句柄,问题是它无法找到旧实例窗口的句柄。因此,我们无法找到窗口句柄再次显示出来。 任何人都可以帮助找到实现该功能的解决方案吗?

from PySide import QtGui, QtCore
from PySide.QtCore import *
from PySide.QtGui import *
import sys
import os
import tempfile
import win32gui

# enable Ctrl-C to breakdown
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)

# checkSingleton : code modifieed from tendo.SingletInstance
def checkSingleton():

    basename = os.path.splitext(os.path.abspath(sys.argv[0]))[0].replace(
        "/", "-").replace(":", "").replace("\\", "-")  + '.lock'
    lockfile = os.path.normpath(tempfile.gettempdir() + '/' + basename)

    success = False
    try:
        if os.path.exists(lockfile):
            os.unlink(lockfile)
        fd = os.open(lockfile, os.O_CREAT | os.O_EXCL | os.O_RDWR)
        success = True
    except OSError:
        pass

    return success

class MyWin(QWidget):
    def __init__(self):  
        super(MyWin, self).__init__()
        self.setWindowTitle("MyWin")
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint)
        self.tray = QtGui.QSystemTrayIcon(QtGui.QIcon("logo.png"), self)
        self.tray.activated.connect(self.trayClicked)
        self.tray.show()

        btn = QPushButton("Hide")
        btn.clicked.connect(self.onHide)
        btn2 = QPushButton("Close")
        btn2.clicked.connect(self.onClose)

        out = QVBoxLayout()
        out.addWidget(btn)
        out.addWidget(btn2)
        self.setLayout(out)

    def onHide(self):
        self.setWindowFlags(self.windowFlags() | Qt.Tool)
        self.showMinimized()

    def onClose(self):
        sys.exit()

    def showUp(self):
        self.setWindowFlags(self.windowFlags() & (~Qt.Tool))

        self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)
        self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)
        self.setWindowState(Qt.WindowActive)        
        self.show()

    def trayClicked(self, reason):
        if reason == QtGui.QSystemTrayIcon.Trigger:
            self.showUp()

app = QtGui.QApplication(sys.argv)

ret = checkSingleton()
if ret:
    win= MyWin()
    win.setGeometry(100,100,300,300)
    win.show()
    app.exec_()
else:
    print "One instance has already been running"
    hwnd = win32gui.FindWindow("QWidget","MyWin")  # < ==  Fail to find the handle of window instance
    if hwnd != 0:
        win32gui.SetForegroundWindow(hwnd)
        win32gui.ShowWindow(hwnd, 1)

我们使用Spy ++搜索窗口,没有&#34; MyWin&#34;记忆中的命名窗口。

0 个答案:

没有答案