现在有程序A和程序BA 等待B发送命令 A收到命令后发送文本给BB接受A发送的文本,程序B需要开多个,关键的问题就是:程序B需要开多个用了findwindow函数做了下,功能上是可以实现 但是只可以 A发送给一个B 而另外一个B就没法接受了。然后试了很多山寨的做法 设置topmost 和 获取焦点 都不好用。请问各位高人,两个程序通信(我这种情况的)有什么比较好的方式吗?

解决方案 »

  1.   

    本机上的程序通信可以用管道或者socket,像你说的多个客户端的用Socket比较好。
      

  2.   

    可以用共享内存。
    .net4.0有MemoryMappedFile,但4.0前要自己写。
      

  3.   

    用socket 需要开启端口吧? 开启端口的东西 杀毒软件会不会提示?
      

  4.   


    A可以作为服务端,监听请求。
    B可以作为客户端,发送请求。等B发送请求后,A可以对每一个不同的B发送文件。这样的情况适合用1对多的Socket编程,开启端口,除非杀毒软件有监视,一般是没有问题的。Socket编程可以参考,这个异步通信的例子:
    http://www.codeproject.com/KB/IP/AsyncSocketServerandClien.aspx例子演示效果图:
      

  5.   

      用枚举窗体,将所要的窗口(例如Form1)地址枚举出来,
    保存到队列中,再对这些队列中的地址发送你的信息:
    public  delegate bool EnumWindowsCallback(IntPtr hWnd, int lParam);
      [DllImport("User32.dll", EntryPoint = "EnumWindows")]
    private static extern IntPtr EnumWindows(EnumWindowsCallback callback, int lParam);
      Queue windowsQueue = new Queue();         Boolean  EnumWindows(IntPtr hwnd, int lParam)
            {
                StringBuilder windowText=new StringBuilder(255) ;
                GetWindowText(hwnd, windowText, 255);
               
                if (windowText.ToString() == "Form1")
                {
                    windowsQueue.Enqueue(hwnd);
                }
                return  true ;
            }
            private void buttonEnum_Click(object sender, EventArgs e)
            {
                EnumWindows(new EnumWindowsCallback(EnumWindows), 0);
            }'===============================================================
    '发送
             while(windowsQueue.Count > 0)
            {
               SendMessageA((IntPtr)windowsQueue.Dequeue(), 74, 0, ref cds);
            }
      

  6.   

    除了 socket 还有其他方式吗?
      

  7.   

    用EnumWindows遍历所有窗体
    用GetWindowText和GetClassName获得窗口的标题和类名,就可以判断出是不是B窗口了