4

我想将消息从 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 桌面应用程序进程无法接收该消息。你能帮我吗?

4

3 回答 3

4

该服务和桌面应用程序在两个不同的窗口站中运行。出于安全原因,不可能在不同窗口站中运行的应用程序之间发送窗口消息。

为了在服务和桌面应用程序之间进行通信,您必须使用某种进程间通信方法(很好的可能性是套接字、命名管道、DCOM 等)或在其中一种之上运行的某些框架,例如远程处理或 WCF。

于 2012-10-19T17:33:51.230 回答
2

我怀疑这是因为这两个进程在不同的用户帐户下运行。

我认为您需要使用更改消息过滤器功能才能接收到它,请参见此处:

ChangeWindowMessageFilterEx 函数

于 2012-10-19T14:20:22.427 回答
0

一种方法是在您的服务中托管 WCF 接口。然后,这允许(可能)任何应用程序和服务之间进行通信。

查看这些链接以获取详细示例:

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

于 2012-10-19T14:36:13.290 回答