例如:有两个应用程序,分别分布于不同的计算机上,现在要实现从一个应用程序向局域网内的另一个应用程序发消息,应如何实现?
详细需求如下:
一卡通系统集成多个cs或bs系统方案流程: 
UserId(用户名) AppSysRegisterInfo UserName Password 
01 1 Mfm1 Mfm1 
01 2 Mfm2 Mfm2 
01 3 Mfm3 Mfm3 
01 4 Mfm4 Mfm4 
01 5 Mfm5 Mfm5 
01 6 Mfm6 Mfm6 
备注:其中1,2,3,4,5,6各别代表六大应用系统。 2. 建立员工在一卡通系统中的用户名和其他系统中的用户名之间的对应关系并保存。可保存在表中或LDAP中或文件系统中。考虑到灵活性,可以考虑让用户自己去维护这种对应关系表。 
3.业务流程如下: 
1).当对应关系表建好后,即可登录其它系统。比如:人事与考qing系统,当第一次进入该系统时,在该系统中生成一个sysuser.xml文件,里面记录了登录该系统的用户名和密码。 
2.)当系统再次启动时,先判断自身目录下是否存在“sysuser.xml”文件 ,当不存在时则象以往一样弹出登陆输入界面 
3).如果存在,则读取文件中的用户名、密码、服务器名等信息,读取后,一定要将本文件删除。 
4).用读取到的用户名在人事与考qing系统中找,如果存在该用户,则将该用户的密码通过32位的 MD5 加密方法加密得到密串,再将此密串与文件中读取的密串进行比较(比较不区分大小写),如果密串一致,则直接跳过登陆界面,以此用户登陆系统,进入系统主界面。否则跳至登陆界面。 
5). 如果是不能做任何改动的客户端 ,那么可采用WIN消息(给登录窗口发送用户名,密码等登录所需要的信息),模拟键盘(.net有模拟键盘输入的API)。 
如果是可以做改动的客户端 - 参数传递,并让登录的EXE文件读取参数进行认证。 
现在在本机上调试成功,可以相互通讯,且能模拟回车键,从而跳过登录页,但把两个应用程序分布于不同的机器上时,发现根据findwindow(null,"Form1")根本就找不到远程机上的进程,急盼解决,分不够再加?
详细代码如下:

解决方案 »

  1.   

    发送方代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Diagnostics;namespace SendInfo
    {
        //WM_COPYDATA消息所要求的数据结构
        public struct CopyDataStruct
        {
            public IntPtr dwData;
            public int cbData;        [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }  
        public partial class Form1 : Form
        {
            public static Form1 pCurrentWin = null; 
            public const int WM_COPYDATA = 0x004A;        private const int WM_KEYDOWN = 0x0100; 
            //通过窗口的标题来查找窗口的句柄
            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int FindWindow(string lpClassName, string lpWindowName);        //先声明下API
            [DllImport("User32.dll", EntryPoint = "PostMessage")]
            private static extern int PostMessage(
            int hWnd,   //   handle   to   destination   window   
            int Msg,   //   message   
            int wParam,   //   first   message   parameter   
            int lParam   //   second   message   parameter   
            );           //在DLL库中的发送消息函数
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage
                (
                int hWnd,                        // 目标窗口的句柄  
                int Msg,                        // 在这里是WM_COPYDATA
                int wParam,                    // 第一个消息参数
                ref  CopyDataStruct lParam        // 第二个消息参数
                );        public static void SendMessage(int toWindowHandler, int msgID, string strMsg)
            {
                if (strMsg == null) return;
                    if (toWindowHandler != 0)
                    {
                        CopyDataStruct cds;
                        cds.dwData = (IntPtr)msgID;   //这里可以传入一些自定义的数据,但只能是4字节整数      
                        cds.lpData = strMsg;          //消息字符串
                        cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1;  //注意,这里的长度是按字节来算的                    //发送方的窗口的句柄, 由于本系统中的接收方不关心是该消息是从哪个窗口发出的,所以就直接填0了
                        int fromWindowHandler = 0;
                        SendMessage(toWindowHandler, WM_COPYDATA, fromWindowHandler, ref  cds);
                    }        }        public Form1()
            { 
                InitializeComponent();
                pCurrentWin = this;
            }        private void Form1_Load(object sender, EventArgs e)
            {
            }        private void button1_Click(object sender, EventArgs e)
            {
              int  ParenthWnd =FindWindow(null,"Form1");
                //判断这个窗体是否有效 
                if (ParenthWnd !=0)
                {
                    MessageBox.Show("找到窗口");
                }
                else
                {
                    MessageBox.Show("没有找到窗口");
                }            Form1.SendMessage(ParenthWnd, 5, "send");
               // Form1.PostMessage(ParenthWnd, WM_KEYDOWN, 0, 0);
                Form1.PostMessage(ParenthWnd, WM_KEYDOWN, 0x0D, 0);
            }
        }
    }接收方代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;namespace ReceiveInfo
    {
        //WM_COPYDATA消息所要求的数据结构
        public struct CopyDataStruct
        {
            public IntPtr dwData;
            public int cbData;        [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }  
        public partial class Form1 : Form
        {
                    public const int WM_COPYDATA = 0x004A;
            //通过窗口的标题来查找窗口的句柄
            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);        public Form1()
            {
                InitializeComponent();
            }        protected override void DefWndProc(ref System.Windows.Forms.Message m)
            {
                switch (m.Msg)
                {
                    //接收自定义消息 USER,并显示其参数
                    case WM_COPYDATA:
                        CopyDataStruct mystr = new CopyDataStruct();
                        Type mytype = mystr.GetType();
                        mystr = (CopyDataStruct)m.GetLParam(mytype);
                        this.textBox1.Text = mystr.lpData;
                        //摸拟回车键
                       // SendKeys.Send("ENTER");如果此处加入了此句,无法达到效果
                        break;
                    default:
                        base.DefWndProc(ref m);
                        break;
                }
            }
    }
            private void Form1_Load(object sender, EventArgs e)
            {
                this.button1.Focus();        }        private void button1_Click(object sender, EventArgs e)
            {
                keyStrike k = new keyStrike();
                k.Show();
            }    }
    }
    上面的两个应用程序代码在本机上能互相通讯,但当把接收方这个应用程序步署在其它计算机上时,通过int  ParenthWnd =FindWindow(null,"Form1");
                //判断这个窗体是否有效 
                if (ParenthWnd !=0)
                {
                    MessageBox.Show("找到窗口");
                }
                else
                {
                    MessageBox.Show("没有找到窗口");
                }
    找不到窗口,请哪位兄弟指点一下,分不够再加
      

  2.   

    窗口和消息只在本机上有效,分布式的应用应该使用网络通讯,可以用socket、DotNet Remoting 等方法
      

  3.   

    用Remoting做,方案我已经发到你的邮箱中了,给分啊