Как восстановить свернутое в системный трей окно 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".