Отправка сообщения приложению, запущенному другим пользовательским сеансом Windows

StackOverflow https://stackoverflow.com/questions/1673507

  •  16-09-2019
  •  | 
  •  

Вопрос

Настольное приложение (созданное в Delphi) запускается пользователем А.Назовем его «Экземпляр А».

Пользователь А выполняет «переключение пользователя», и Пользователь Б входит в систему.

Пользователь Б запускает то же приложение.Назовем его «Экземпляр Б».

Сейчас я хочу, чтобы экземпляр B мог отправлять сообщения в экземпляр A.

Я попробовал следующее:Экземпляр A записывает свой дескриптор в файл, поэтому экземпляр B может открыть этот файл, прочитать дескриптор и использовать его для отправки сообщения в экземпляр A, но это не работает — возможно, из соображений безопасности Windows его не предоставляет. доступ пользователя к дескрипторам запущенных процессов другого пользователя...

«Плохой» способ сделать это — заставить экземпляр A проверять определенный файл или местоположение реестра каждые несколько секунд, чтобы экземпляр B мог записать туда что-то, а экземпляр A получил это...но это, очевидно, обременительное и неизящное решение.

Вместо этого мне нужен способ, с помощью которого экземпляр B пользователя B может отправить безобидное сообщение экземпляру A пользователя A, после чего экземпляр A просыпается и решает, что с этим делать.

Спасибо за любые предложения!

Это было полезно?

Решение

Вы не можете использовать SendMessage, PostMessage и подобные функции, поскольку вашему приложению недоступны экземпляры из разных пользовательских сессий.

Вы можете использовать именованные каналы, семафоры и т. д.в глобальном пространстве имен (т.е.имена с префиксом «Global»).Затем создайте в своем приложении отдельный поток, который, например, будет спать до тех пор, пока не поступит «сигнал» от одного из них, и уведомит об этом главное окно.

Чтобы сэкономить ресурсы, используйте WTSRegisterSessionNotification, чтобы получать уведомления о переключении сеанса и создавать поток только в этот момент.

Дополнительная информация здесь:http://support.microsoft.com/kb/310153и здесь:http://msdn.microsoft.com/en-us/library/ms997634.aspx

Другие советы

Разве это не та же проблема, что и запуск службы Windows под системной учетной записью и взаимодействие с ней пользовательского экземпляра какого-либо приложения?Тогда, возможно, вам стоит погуглить межпроцессное взаимодействие (именованные каналы и т. д.).

Вы также можете использовать UDP или TCP/IP, но я думаю, что использование именованных каналов лучше для «локальной» связи (хотя я никогда этого не делал).

Читать здесь об именованных каналах в MSDN.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top