zoukankan      html  css  js  c++  java
  • C#中在窗体间使用消息来处理相关联的事件

                 在项目中有这样的需求,在主窗体隐藏时或者主进程运行时对其它窗体的控件或者事件进行控制,而且其它窗体是处于活动状态,而主窗体或者主进程是隐藏在后面的。这个时候使用句柄和消息来处理就比较好解决这些问题了,当然了也可以使用其它方法。比如将其它窗体在主窗体中申明并且定义,使之和主窗体一样一直存在于内存中,在各个窗体中申明公共方法,在主进程需要调用时直接调用即可,但是这样耗费了大量的系统资源。现在使用消息来解决这个问题。下面提供一个小程序,在主窗体中通过句柄和消息来控制子窗体中Label上文字变化和颜色,代码如下:


    Windowns的API类

    using System;
    using System.Runtime.InteropServices;

    namespace TestHwnd
    {
        public class Win32API
        {
             [DllImport("user32.dll ", CharSet = CharSet.Unicode)]
            public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, string wParam, string lParam);

        }

    }


    主窗体程序(发送消息):

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    namespace TestHwnd
    {
        public partial class Main : Form
        {

            //定义了一个子窗体的句柄
            public IntPtr hwndfrmTest;
            

            public Main()
            {
                InitializeComponent();
            }

         

            private void timer1_Tick(object sender, EventArgs e)
            {

                if(hwndfrmTest!=(IntPtr)0)
                {
                    if(DateTime.Now.Second % 3 == 0)
                    {
                        Win32API.PostMessage(hwndfrmTest, 0x60"""");
                    }
                    
                    if(DateTime.Now.Second % 5 == 0)
                    {
                        Win32API.PostMessage(hwndfrmTest, 0x61"""");
                    }
                    
                }
                
            }


            void Button2Click(object sender, EventArgs e)
            {
                frmTest frm=new frmTest();
                frm.Show(this);
            }
        }

    子窗体程序(接收消息)

    using System;
    using System.Drawing;
    using System.Windows.Forms;

    namespace TestHwnd
    {
        /// <summary>
        /// Description of frmTest.
        /// </summary>
        public partial class frmTest : Form
        {
            Main main;
            public frmTest()
            {
                //
                // The InitializeComponent() call is required for Windows Forms designer support.
                //
                InitializeComponent();
                
                //
                // TODO: Add constructor code after the InitializeComponent() call.
                //
            }
            
            void FrmTest_Load(object sender, EventArgs e)
            {

                main = this.Owner as Main;

                 //初始化该窗体的句柄

                main.hwndfrmTest = this.Handle;
            }
            
            ///重写窗体的消息处理函数DefWndProc,从中加入自己定义消息 MYMESSAGE 的检测的处理入口
            protected override void DefWndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case 0x60:
                        {
                            label1.ForeColor=Color.Red;
                            label1.Text = DateTime.Now.ToString() + "-" + "测试成功。。。。,呵呵,变红了";
                        }
                        break;
                    case 0x61:
                        {
                            label1.ForeColor=Color.Blue;
                            label1.Text = DateTime.Now.ToString() + "-" + "测试成功。。。。,呵呵,变蓝了";
                        }
                        break;
                    default:
                        base.DefWndProc(ref m);
                        break;
                }
            }
            
            
            
            void Button1Click(object sender, EventArgs e)
            {
                    main.hwndfrmTest = (IntPtr) (0);
                this.Close();
            }
        }
    }













    }

  • 相关阅读:
    C#中的Singleton模式
    CodeLib
    Google Chats 居然和Gmail集成了...
    Windows中OSG环境搭建
    Socket中winsock.h和winsock2.h的不同
    高斯日记 蓝桥杯
    MATLAB矩阵处理
    马虎的算式 蓝桥杯
    MATLAB基础
    矩阵相乘的一维数组实现
  • 原文地址:https://www.cnblogs.com/kevinGao/p/2231525.html
Copyright © 2011-2022 走看看