Есть приложение, подолгу живущее в трее. Юзеры иногда забывают, что оно уже активно, и пытаются запустить еще раз. Поначалу оно просто проверяло, есть ли работающий экземпляр (через создание глобального объекта ядра — события или мьютекса), и выдавало ошибку. Теперь захотелось, чтобы в такой ситуации новый экземпляр просил работающий вылезти из трея, а сам тихо завершался.
Попробовал управлять через те же глобальное событие/мьютекс, но, если у процессов разный уровень прав (например, пользователь-администратор), то CreateEvent/CreateMutex возвращают ERROR_ACCESS_DENIED. Для предотвращения запуска второго экземпляра это годится, а управлять уже не дает.
Попробовал через BroadcastSystemMessage — сообщения не передаются более привилегированному процессу, только в сторону понижения прав. Функция всегда возвращает 1. Пробовал в разных комбинациях BSM_APPLICATIONS, BSM_ALLCOMPONENTS, BSM_ALLDESKTOPS и BSF_SENDNOTIFYMESSAGE, BSF_POSTMESSAGE — ничего не меняется.
Все процессы запускаются в одном сеансе (1), различаются только Logon Session Id.
Пробовал добавлять SE_TSB_NAME — добавляется успешно, но тоже ничего не меняется.
Может, есть какой-нибудь минимально геморройный способ из одного процесса известить другой по известному им обоим идентификатору?