Является ли функция Win32 PostMessage пользовательской сессией или машиной? Я хочу использовать его для отправки информации одному экземпляру приложения, которое также запускается на сервере терминалов с несколькими пользователями. Так что, если это будет работать только на машине, это вызовет проблемы.

Реализация:

[DllImport("user32")]
public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);

Большое спасибо!

-2
BendEg 30 Дек 2015 в 11:23

2 ответа

Лучший ответ

Является ли функция Win32 PostMessage пользовательской сессией или машиной?

Ни то, ни другое. Сообщения передаются между процессами на определенном рабочем столе . См. Раздел MSDN на Настольных ПК .

Однако, поскольку каждый рабочий стол находится в определенном сеансе удаленного рабочего стола (также известного как службы терминалов), невозможно отправить сообщение процессу, который находится в другом сеансе.

1
Harry Johnston 30 Дек 2015 в 22:00

У вас не может быть одноэкземплярной программы, которая одновременно показывает окна в нескольких сеансах терминальных служб или взаимодействует с другими сеансами с помощью сообщений Windows.

Если ваш вопрос заключается в том, как вы можете гарантировать, что ваша программа взаимодействует только с приложениями в одном сеансе, ответ таков: вам не нужно ничего делать.

Каждая программа Windows ограничена использованием функций Windows USER32 в одном сеансе, поэтому PostMessage будет отправлять сообщения окнам только в том же сеансе.

Обратите внимание, что в одном сеансе могут размещаться процессы, принадлежащие разным пользователям - это то, что делает функция «Запуск от имени». Однако существуют некоторые ограничения на взаимодействие этих процессов друг с другом.

Если ваш вопрос заключается в том, как разрешить одновременное использование одного экземпляра программы пользователями в разных сеансах, ответ заключается в том, что вы должны разделить процесс на два.

Сервисные и Клиентские приложения, которые запускаются для каждого пользователя в его собственном сеансе. Я бы порекомендовал клиенту активировать сервис и общаться с ним через DCOM. Это может быть двусторонний канал, чтобы служба могла отправлять команды и клиентским приложениям, как только связь будет установлена.

1
Ben 30 Дек 2015 в 15:37