Повторный запуск приложения

Как можно отследить открытую копию приложения и закрыть основное?

Я прочитал что для этого используются мьютексы и семафоры, но как это связать с PyQt5 не знаю.

Например я запускаю приложение, и после его запуска снова его открываю. Как мне, например, предупредить что приложение уже запущено?

Надеюсь на Вашу помощь.


Ответы (1 шт):

Автор решения: S. Nick

Вы можете добиться чего-то подобного с помощью модуля win32gui.

Чтобы установить его, введите в CMD pip install win32gui .

Теперь это код:

import win32gui
import sys

def windowEnumerationHandler(hwnd, top_windows):
    top_windows.append((hwnd, win32gui.GetWindowText(hwnd)))

top_windows = []

win32gui.EnumWindows(windowEnumerationHandler, top_windows)

for i, min in enumerate(top_windows):
    if min[1]:
        print(f'{i:>4} --> {min[1]} ')

        #    w.setWindowTitle("Test q1346046.py")
#           vvvvvvvvvvvvvvvv   ^^^^^^^^^^^^^^^^      
        if "Test q1346046.py" in min[1]:        
            print(min, '<---- это приложение уже запущено ранее.')
            win32gui.ShowWindow(min[0], 5)
            win32gui.SetForegroundWindow(min[0])
            sys.exit()
            
            break

# ВАША ПРОГРАММА ЗДЕСЬ vvvvvvvvvvvvvvvvvvvvvvvvvvv
    
from PyQt5.QtWidgets import QApplication, QWidget

def main():

    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(500, 200)

#                     vvvvvvvvvvvvvvvv
    w.setWindowTitle('Test q1346046.py')                    # !!! +++
#     ^^^^^^^^^^^^^^ 
    
    w.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

введите сюда описание изображения


Обычно вначале программа получает имя каждого открытого окна.

Если имя окна совпадает с именем программы, оно выводит программу на передний план и закрывает ее.
Если нет, то открывается новая программа.

→ Ссылка