Лучший способ - использовать межпроцессный обработчик, например мьютекс.
Здесь - хороший пример.
Еще одна вещь, если вы хотите открыть скрытое приложение из другого экземпляра, вы должны установить связь клиент-сервер между двумя приложениями. Приложение, которое уже запущено, должно быть сервером и должно слушать команду, чтобы стать видимой. Это довольно просто, но для понимания требуется много времени.
ОБНОВЛЕНИЕ:
Здесь Я создал простую библиотеку, которая позволяет вам управлять экземплярами приложения. Это очень просто, но я оставляю некоторые комментарии
ApplicationSingleInstance - это основной класс для управления экземплярами приложения
Когда приложение запускается, проверьте свойство IsInstanceAlreadyRun, если это правда, вызовите метод StartServer (), если false, вызовите метод NotifyAboutNewInstance (). Также вы должны подписаться на событие NewApplicationInstanceLoaded, чтобы узнать, был ли запущен новый экземпляр приложения. Не забудьте отписаться от событий и утилизировать экземпляр ApplicationSingleInstance
ОБНОВЛЕНИЕ:
Я разместил эту библиотеку и объяснение на codeproject