Как передать сообщение из службы Windows в настольное приложение Windows, используя C#?
Я хочу передать сообщение от службы Windows уже запущенному приложению Windows. Я реализовал таймер на службе Windows. Через некоторое время служба отправляет сообщение в приложение Windows.
Код услуги или отправителя указан ниже:
System.Diagnostics.Process[] lProcs = System.Diagnostics.Process.GetProcessesByName("TestProcess2");
if (lProcs.Length > 0)
{
IntPtr handle = lProcs[0].MainWindowHandle;
if (handle != IntPtr.Zero)
SendMessage(handle, 232, IntPtr.Zero, IntPtr.Zero);
}
и код приложения (получателя) рабочего стола Windows выглядит следующим образом:
protected override void WndProc(ref Message m)
{
if (m.Msg == 232)
{
MessageBox.Show("Received");
}
else
{
base.WndProc(ref m);
}
}
приведенный выше код работает нормально, когда оба процесса являются настольным приложением Windows. Когда я использовал службу Windows в качестве отправителя, процесс приложения Windows Desktop не может получить сообщение. Не могли бы вы мне помочь?
3 ответа
Служба и настольное приложение работают в двух разных оконных станциях. По соображениям безопасности невозможно отправлять оконные сообщения между приложениями, работающими на отдельных оконных станциях.
Чтобы обмениваться данными между службой и настольным приложением, вы должны использовать какой-либо метод межпроцессного взаимодействия (хорошие возможности - это сокеты, именованные каналы, DCOM и т. Д.) Или некоторую инфраструктуру, работающую поверх одного из них, например, Remoting. или WCF.
Я подозреваю, что это потому, что два процесса работают под разными учетными записями пользователей.
Я думаю, что вам нужно использовать функцию фильтра сообщений об изменениях, чтобы получить его, смотрите здесь:
Один из способов сделать это - разместить интерфейс WCF в вашем сервисе. Это тогда позволяет связь между (потенциально) любым приложением и сервисом.
Проверьте эти ссылки для подробных примеров:
http://www.codeproject.com/Articles/38160/WCF-Service-Library-with-Windows-Service-Hosting http://msdn.microsoft.com/en-us/library/ms733069.aspx