C#多窗口通讯,发送接收消息

From1

using System.Runtime.InteropServices;  

namespace text1
{
    
    public partial class Form1 : Form
    {
        public const int USER = 0x500;

        public const int MYMESSAGE = USER + 1; 

        public Form1()
        {
            InitializeComponent();
            
        }
        protected override CreateParams CreateParams
        {
            get
            {
                var result = base.CreateParams; ;
                result.ExStyle |= 0x08000000; // WS_EX_NOACTIVATE
                return result;
            }
        } 
        //判断子窗体是否存在
        private bool checkChildFrmExist(string childFrmName)
        {
            foreach (Form childFrm in this.MdiChildren)
            {
                if (childFrm.Name == childFrmName) //用子窗体的Name进行判断,如果存在则将他激活
                {
                    if (childFrm.WindowState == FormWindowState.Minimized)
                        childFrm.WindowState = FormWindowState.Normal;
                    childFrm.Activate();
                    return true;
                }
            }
            return false;
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
   //     bool YesOrNo = false;
        Form2 fr = new Form2();
        private void textBox1_Click(object sender, EventArgs e)
        {
            //if (this.checkChildFrmExist("Form2") == true)
            //{

            //    fr.Hide();
            //    textBox1.Focus();
            //    return;

            //}
            //else
            //{
            //    fr.TopMost = true;
            //    fr.MdiParent = this;
            //    fr.Getfocus += new GetFromfocus(fr_Getfocus);
            //    fr.Show();
            //    textBox1.Focus();

            //}
            //点第一次显示,第二次消失,不想要这个功能将上面的注释打开
            if (fr.Visible)
            {
                fr.Hide();
                textBox1.Focus();
            }
            else
            {
             //   fr.MdiParent = this;
                fr.Getfocus += new GetFromfocus(fr_Getfocus);//事件委托
                fr.Show();
                textBox1.Focus();
            }

        }

        void fr_Getfocus(bool topmost)
        {
           // throw new NotImplementedException();
            textBox1.Focus();
            textBox1.Select(textBox1.TextLength, 0);//作用将光标显示在最后
        }

        ///重写窗体的消息处理函数DefWndProc,从中加入自己定义消息 MYMESSAGE 的检测的处理入口  

        protected override void DefWndProc(ref Message m)
        {
            switch (m.Msg)
            {

                //接收自定义消息MYMESSAGE,并显示其参数  

                case MYMESSAGE:

                    Form2.My_lParam ml = new Form2.My_lParam();

                    Type t = ml.GetType();

                    ml = (Form2.My_lParam)m.GetLParam(t);

                    textBox1.Text += ml.s;

                    break;

                default:

                    base.DefWndProc(ref m);

                    break;
            }
        }  
    }
}

From2:

using System.Runtime.InteropServices;
//using DevComponents.DotNetBar;
//using DevComponents.DotNetBar.Rendering;



namespace text1
{
    
   public delegate void GetFromfocus(bool topmost);
    public partial class Form2 : Form
    {
        public const int USER = 0x500;
        public const int MYMESSAGE = USER + 1;
    //    private eOffice2007ColorScheme m_BaseColorScheme = eOffice2007ColorScheme.Blue;
        string str1 = "";

        public Form2()
        {
            InitializeComponent();
           
            
        }

        public event GetFromfocus Getfocus;
       
        IntPtr HD;

          public Form2(IntPtr hd)
        {
            InitializeComponent();
           
            HD = hd;
            
        }


        //事件委托,作用不失去焦点(有没有都行都能显示数字,这个只是为了将光标显示出来)
          private void Form2_Click(object sender, EventArgs e)
          {
             Getfocus(true); 
          }

          //还可以更加简化,对btn按钮进行定义,设置ID,然后用case1,2,3,4...等,参考周工那个程序的代码 
        private void button1_Click(object sender, EventArgs e)
        {
            str1 = "1";
            Downbutton(str1);

        //    string strbtn = button1.Name.ToString();
        }

     
        private void Downbutton( string str)
        {
            string str2 = str;

            IntPtr ptr = FindWindow(null, "Form1");

            My_lParam m = new My_lParam();
            m.s = str2;
            m.i = m.s.Length;
            SendMessage(ptr, MYMESSAGE, 1, ref m);
            Getfocus(true);
    
        }


        public  struct My_lParam  
       {  
  
           public int i;  
  
           public string s;  
  
       }  

        [DllImport("User32.dll", EntryPoint = "SendMessage")]

        private static extern int SendMessage(

        IntPtr hWnd,        // 信息发往的窗口的句柄  

        int Msg,            // 消息ID  

        int wParam,         // 参数1  

        ref My_lParam lParam

        ); 

        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
         void btn_Click(Button btn)
        { 
           // Button b = sender;
            string strbtn = btn.Text;
        }
        private void Form2_Load(object sender, EventArgs e)
        {
            button3.Click += new EventHandler(buttonx_Click);
         //   button4.Click += new EventHandler(button4_Click);
            this.StartPosition = FormStartPosition.Manual;//启动位置改为手动
            this.Location = new Point(SystemInformation.WorkingArea.Width - this.Width, SystemInformation.WorkingArea.Height - this.Height);//显示到右下角
        }

        void buttonx_Click(object sender, EventArgs e)
        {
            Button  strbtn = sender as Button;
            string btnstr = strbtn.Text;
            Downbutton(btnstr);
        }

        //如果要标题栏下面的代码没用,如果不要标题栏下面的代码有用
        private Point offset;
        private void Form2_MouseDown(object sender, MouseEventArgs e)
        {
            if (MouseButtons.Left != e.Button) return;
            Point cur = this.PointToScreen(e.Location);
            offset = new Point(cur.X - this.Left, cur.Y - this.Top);
        }

        private void Form2_MouseMove(object sender, MouseEventArgs e)
        {
            if (MouseButtons.Left != e.Button) return;
            Point cur = MousePosition;
            this.Location = new Point(cur.X - offset.X, cur.Y - offset.Y);
        }
    }
}

在网上看到更加简单的方法,纯纯的C#代理,搬来参考原网址http://blog.sina.com.cn/ygycy2008

在程序开发中,我们会经常进行不同窗体之间的参数传递,那么如何进行传递更好方便有效呢?实际上我们利用委托和事件进行这项工作是一个不错的选择。今天我们通过一个简单的例子进行说明。大概的思路是建立一个传递参数的类,在类中定义一个带参数的委托,申明一个委托的事件,并定义一个触发事件的带参数的方法。由窗体A中调用类的带参数的方法,从而触发事件,并将窗体A中的参数传递给委托事件,再由委托事件将参数传递给窗体B中的方法,些方法将传递过来的参数写入窗体B中。

具体方法如下:

1、定义一个传递参数的类

 public static class chuancan

    {

        public delegate void delegateycyhande(string str1,string str2 );//定义一个委托

        public static event delegateycyhande chuanevent;//申明一个事件

        public static void Dodelegateycyhande(string str1,string str2)//定义一个触发事件的方法

        {

            chuanevent(str1,str2);

        }

    }

2、父窗体程序

 public partial class mf : Form

    {

        public mf()

        {

            InitializeComponent();

            chuancan.chuanevent+=new chuancan.delegateycyhande(this.DoMethod);//在构造函数中关联事件,这一点很重要。

        }

        public void DoMethod(string getstr1,string getstr2)//为listbox赋值的方法

        {

            string str = getstr1;

            str += "    ";

            str+=getstr2;

            listBox1.Items.Add(str);

        }

        private void bt_zairucf_Click(object sender, EventArgs e)// 打开子窗体

        {

            cf cf1 = new cf();

            cf1.Show();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            listBox1.Items.Clear();

        }

    }

3.子窗体程序

 public partial class cf : Form

    {

        public cf()

        {

            InitializeComponent();

        }

       private void bt_zairu_Click_1(object sender, EventArgs e)

        {

 //调用chuancan类中的Dodelegateycyhande方法来激发事件

            chuancan.Dodelegateycyhande(this.textBox1.Text, this.textBox2.Text);

            textBox1.Text = "";

            textBox2.Text = "";

            textBox1.Focus();

        }

}

程序运行时,首先显示的是父窗体,通过按键开启子窗体,在子窗体中输入信息,点击按钮,将信息传递给父窗体的显示控件。

当然这个例子中介传递两个参数,我们可以根据需要增加参数的个数。

另外我在练习这个编程时,还发现一个有趣的事情。那就是我不想通过按钮来触发事件,而是想通过子窗体中的文本框的属性的值的改变即textchanged事件来触发委托事件,结果就出现了我意想不到的效果:我在子窗体的textbox中输入一个字符如“我”,父窗体listbox中马上就出现一个字符“我”,这个很正常吧,我接着在textbox中输入一个“们“,父窗体listbox中不是出现一个”们“,而是在第二行出现”我们“,第一行出现”我“;我又接着输入一个”是“ ,父窗体listbox中第三行出现”我们是“......,也就我在textbox 中每增加 一个字,listbox就会新增一行并把textbox所有信息显示出来。反过来如果我每减少一个字,listbox就会少一个字并显示现有的所有字符,很是有趣吧,这倒底是为什么呢?可能与委托事件触发的机制有关吧!

这部分原网址:http://blog.sina.com.cn/ygycy2008

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值