В QT для этого предусмотрен специальный класс QtSingleApplication Для того чтобы быстро разобраться как он работает, предлагаю склонировать репозиторий примера выполнив команду:
git clone git://code.qt.io/qt-solutions/qt-solutions.git
Далее выполнить билд, у меня Linux, поэтому для Windows может слегка отличаться в папке qtsingleapplication
запустил последовательно 3 команды:
- конфигурирование:
./configure
- создание мейкфайла:
qmake
- билд:
make
После чего перешел в папку qt-solutions/qtsingleapplication/examples/trivial/
Там содержится программа с GUI
при первом запуске она отображает пустое окно
с TextEdit
а при повторных в TextEdit
добавляются строки "Wake up!"
Делается это в main таким образом:
QtSingleApplication instance(argc, argv); // получаем инстанс программы
if (instance.sendMessage("Wake up!")) // тут можно прокинуть аргумент (?.mp3)
return 0; // выходим не создавая второй инстанс
При первом запуске sendMessage
не отрабатывает и мы не заходим в условие, но если экземпляр не закрыт то повторные запуски будут вести прямо в условие отсылая сообщение.
В общем случае процесс выглядит приблизительно так: в системе регистрируется уникальный объект который можно каким-то образом найти. При запуске экземляра проверяется есть ли такой объект если он есть то программа завершается, между запуском и выходом есть возможность обработать аргументы, таким образом запуск программы служит не открытию нового окна а передаче аргументов уже открытому инстансу. По такому принципу действуют многие программы в системе, ярким примером может выступать браузер.
Так же, возможно, пригодится эта ссылка https://evileg.com/ru/post/147/ в ней более подробно рассказывается о том что я написал выше.