Как восстановить свернутое в системный трей окно QT из другого процесса?

Это одна особенность в большой системе. Мы упростим задачу в следующем примере кода.

В примере мы можем нажать "скрыть", чтобы свернуть окно в системный трей с помощью скрытой кнопки панели задач. Если мы нажмем кнопку в трее, скрытое окно может снова отобразиться.

Мы надеемся реализовать эту функцию: когда один экземпляр запущен и окно свернуто в системный трей, мы запускаем другой экземпляр (с тем же сценарием), затем новый экземпляр активирует окно старого экземпляра и показывает его обратно.

Новый экземпляр использует 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++ для поиска окна, в памяти нет именованного окна "MyWin".

0 ответов

Другие вопросы по тегам