这是大系统中的一个功能。我们将问题简化为下面的示例代码。
在示例中,我们可以点击"隐藏"在隐藏任务栏按钮的情况下将窗口最小化到系统托盘中。如果我们单击托盘按钮,则隐藏窗口可以再次显示。
我们希望实现该功能:当一个实例启动并且窗口已最小化到系统托盘中时,我们启动另一个实例(使用相同的脚本),然后新实例激活旧实例的窗口,展示回来。
新实例使用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;记忆中的命名窗口。