我想将消息从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桌面应用程序进程无法接收消息。你能帮我吗?
服务和桌面应用程序正在两个不同的窗口站运行。出于安全原因,不可能在在单独的窗口台上运行的应用程序之间发送窗口消息。
为了在服务和桌面应用程序之间进行通信,您必须使用某种类型的过程间通信方法(良好的可能性是插座,名为Pipes,dcom等)或在其中一个顶部运行的某个框架,例如远程或WCF。
我怀疑这是因为两个过程在不同的用户帐户下运行。
我认为您需要使用更改消息过滤函数允许接收它,请参阅此处:
ChangeWindowMessageFilterex函数
做到这一点的一种方法是在您的服务中托管WCF接口。然后,这允许(潜在的)任何应用程序和服务之间进行通信。
查看这些链接以获取详细示例:
http://www.codeproject.com/articles/38160/wcf-service-library-with-withwish-windows-service-nostinghttp://msdn.microsoft.com/en-us/library/ms733069.aspx