Один из способов достижения вашей цели - создать именованную общую память.
первое приложение создаст именованную общую память и сохранит в своем дескрипторе окна, идентификаторе процесса или любой другой информации, полезной для этой цели.
когда второе приложение пытается создать общую память с тем же именем, оно извлекает дескриптор для той же общей памяти, а возвращаемое значение сообщит вам, что этот объект уже существовал. второе приложение может затем прочитать дескриптор окна из общей памяти и любую другую информацию. тогда он может использовать BringWindowToTop()
, SetForegroundWindow()
или тому подобное.
вы найдете пример именованной общей памяти в Windows SDK. хотя в этом примере используется прямой Win32 API, я вполне уверен, что вы можете выполнить что-то эквивалентное в C #.