很多时候, 我们开发的应用程序, 我不希望程序被点击多次的时候, 打开多个窗口,我只希望最终都是一个窗口存在, 这就是单例模式了lin49940。
- WPF, 在App.xaml.cs 里面
protected override void OnStartup(StartupEventArgs e)
{
//当前运行WPF程序的进程实例
Process process = Process.GetCurrentProcess();
//遍历WPF程序的同名进程组
foreach (Process p in Process.GetProcessesByName(process.ProcessName))
{
//不是同一进程,则关闭后面开的进程
if (p.Id != process.Id)
{ //这个地方用kill 而不用Shutdown();的原因是,
//Shutdown关闭程序在进程管理器里进程的释放有延迟不是马上关闭进程的
process.Kill();
return;
}
}
base.OnStartup(e);
}
附带一个WPF 窗口最大化(非全屏化),在MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
this.WindowState = System.Windows.WindowState.Maximized;
//网上很多人这里用none 样式,会导致标题栏没有了
this.WindowStyle = System.Windows.WindowStyle.SingleBorderWindow;
}
wxPython, 在wx.App 的子类里面
def OnInit(self):
self.name = "AgvLin49940-%s" % wx.GetUserId()
self.instance = wx.SingleInstanceChecker(self.name)
if self.instance.IsAnotherRunning():
return False
# 你的其他代码
return True
PyQt5,MainWindow 里面:
from PyQt5.QtNetwork import QLocalSocket, QLocalServer
class MainWindow(QMainWindow):
if __name__ == '__main__':
try:
app=QApplication(sys.argv)
serverName = 'agvlin49940'
socket = QLocalSocket()
socket.connectToServer(serverName)
# 如果连接成功,表明server已经存在,当前已有实例在运行
if socket.waitForConnected(500):
app.quit()
else:
localServer = QLocalServer() # 没有实例运行,创建服务器
localServer.listen(serverName)
# 处理其他
win = MainWindow()
win.showMaximized()
win.show()
app.exit(app.exec_())
pass
except:
pass