Как передать сообщение из службы 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.

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

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

Функция ChangeWindowMessageFilterEx

Один из способов сделать это - разместить интерфейс WCF в вашем сервисе. Это тогда позволяет связь между (потенциально) любым приложением и сервисом.

Проверьте эти ссылки для подробных примеров:

http://www.codeproject.com/Articles/38160/WCF-Service-Library-with-Windows-Service-Hosting http://msdn.microsoft.com/en-us/library/ms733069.aspx

Другие вопросы по тегам