如何在winforms c#中将实时消息从一个表单发送到另一个表单

本文关键字:表单 一个 另一个 winforms 消息 实时 | 更新日期: 2023-09-27 18:27:01

我的问题是将消息从一个表单发送到另一个表单,当我在表单1的文本框中键入时,应该反映在表单2的文本框中。它就像C#中windows形式的实时教程或实时聊天。与服务器-客户端程序类似,一种形式是服务器,另一种形式为客户端,当我键入按键时,继续从服务器向客户端发送消息。

Form1功能代码(服务器)

按键功能文本框的代码按键时,将值从发送到客户端

    private void msg_KeyPress(object sender, KeyPressEventArgs e)
    {
            int n = e.KeyChar;
            String s = n.ToString();
            msg_box1.AppendText(n.ToString());
            byte[] buffer = ASCIIEncoding.ASCII.GetBytes(s);
            nwStream.Write(buffer, 0, s.Length);
   }

在上面的代码msg是文本框(多行)。我使用了一个keypress函数来生成keypress的ascii值并将其发送到客户端表单

Form2功能代码(客户端)

 var listenthread = new Thread(() =>
        {
            while (true)
            {
                try
                {
                    byte[] instream = new byte[100];
                    ns.Read(instream, 0, 100);
                    string data = System.Text.Encoding.ASCII.GetString(instream);
                    int v = Int32.Parse(data);
                    char c = (char)v;
                    //MessageBox.Show(c.ToString());
                    if (v == (int)Keys.Back)
                    {
                        //SendKeys.send("{BKSP}");
                        ;
                    }
                    else if (v == (int)Keys.Delete)
                    {
                        //SendKeys.send("{BKSP}");
                        ;
                    }
                    else if (v == (int)Keys.Enter)
                    {
                        //SendKeys.send("{BKSP}");
                        ;
                    }
                    else
                    {
                        Action update = () => msg_box1.AppendText(c.ToString());
                        msg_box1.Invoke(update);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        });
        listenthread.IsBackground = true;
        listenthread.Start();

以上是客户端连续接收来自服务器的消息的代码,以便运行后台进程。

在执行时,这两个表单运行时没有错误,并且能够在按键时将字符从form1发送到form2,但

当我在form1的文本框中使用退格键、回车键和删除键时,它们不会反映到form2的文本框而且当我开始在form1的文本框中键入时,光标本身在form2的文本框内不可见。

我甚至尝试过使用sendkeys.send()方法,但它在form1中执行,而不是在form2中执行。

我的问题的目的是制作一个基于实时电子学习的表格,我们在表格1中不断键入它,它应该出现在表格2中,所有的退格、回车键都在上工作,而不是通过编程方式调用它。

如何在winforms c#中将实时消息从一个表单发送到另一个表单

有很多方法可以实现这一点,但没有一种是您所期望的"自动"。你似乎在暗示这两个windows表单的工作方式类似于客户端-服务器系统,但这也意味着这两个表单将托管在不同的进程中?这准确吗?

您的评论似乎表明,您正在将其作为IP客户端/服务器进行尝试,并且在将服务器上完成的文本更改传播到客户端时遇到问题。使用基于密钥的解决方案,当您有特殊字符(如退格)时,您会遇到问题。您必须在客户端实现特殊的密钥处理才能使其工作。

我建议你不要在"KeyTyped"事件中向客户端发送消息,而是让用户按下一些"发送按钮"或返回键将消息发送给客户端。通过这种方式,您将消除客户端的特殊处理,服务器端的控件将适当地处理特殊密钥