Есть так много способов сделать это, что трудно даже понять, с чего начать. Вы можете использовать мьютекс, канал, разделяемую память или любой другой IPC - либо для связи, либо просто проверьте, был ли он создан. Вы можете вызвать app2 из app1 и проверить родительский процесс. Если вы используете внутренний сервер, вы можете отправить два запроса, и сервер сможет проверить, открылось ли сначала приложение app1.
Предполагая, что у вас есть приложение app1, а не app2, самым простым вариантом будет использование драйвера ядра. Добавьте процедуру уведомления процесса и определите, когда запущены app1 и app2, кэшируя их. Если app2 запускается, но app1 не завершает app2 из земли ядра, в противном случае дайте ему запуститьсяВы также можете определить, когда app1 закрывается и завершать app2 одновременно, если хотите.