在C#中SENDMESSAGE和POSTMESSAGE的参数传递

转自:http://www.cnblogs.com/kevinGao/archive/2011/10/30/2231524.html


用 PostMessage、SendNotifyMessage、SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。



5、在 Windows 2000/XP 里,每个消息队列最多只能存放 10,000 个 Post
的消息,超过的还没被处理的将不会被处理,直接丢掉。这个值可以改得更大:[HKEY_LOCAL_MACHINE/SOFTWARE/
Microsoft/Windows NT/CurrentVersion/Windows] USERPostMessageLimit,最小可以是
4000。

PostMessage只负责将消息放到消息队列中,不确定何时及是否处理

SendMessage要等到受到消息处理的返回码(DWord类型)后才继续

PostMessage执行后马上返回

SendMessage必须等到消息被处理后才会返回。

下面通过一个小例子来说明下这2个方法进行参数传递的不同点:

//Win32 API 类

using System;
using System.Runtime.InteropServices;

namespace TestHwnd
{
    public class Win32API
    {
        


        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);

        /// <summary>
        /// 自定义的结构
        /// </summary>
        public struct My_lParam
        {
            public int i;
            public string s;
        }
        /// <summary>
        /// 使用COPYDATASTRUCT来传递字符串
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
        //消息发送API
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            int lParam          //参数2
        );

        
        //消息发送API
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            ref My_lParam lParam //参数2
        );
        
        //消息发送API
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            ref  COPYDATASTRUCT lParam  //参数2
        );

        //消息发送API
        [DllImport("User32.dll", EntryPoint = "PostMessage")]
        public static extern int PostMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            int lParam            // 参数2
        );
        
        
        
        //消息发送API
        [DllImport("User32.dll", EntryPoint = "PostMessage")]
        public static extern int PostMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            ref My_lParam lParam //参数2
        );
        
        //异步消息发送API
        [DllImport("User32.dll", EntryPoint = "PostMessage")]
        public static extern int PostMessage(
            IntPtr hWnd,        // 信息发往的窗口的句柄
            int Msg,            // 消息ID
            int wParam,         // 参数1
            ref  COPYDATASTRUCT lParam  // 参数2
        );

    }
}

//主窗体,发送消息

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 hwndTest;
        public int IwndTest;
        public IntPtr hwndfrmTest;
        

        public Main()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Test test = new Test();
            test.Show(this);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            string strTest = "25425";
            Win32API.COPYDATASTRUCT cds;
            cds.dwData = (IntPtr)100;
            cds.lpData = strTest;
            byte[] sarr = System.Text.Encoding.UTF8.GetBytes(strTest);
            int len = sarr.Length;
            cds.cbData = len + 1;
            
            Win32API.My_lParam lp=new Win32API.My_lParam();
            lp.i=3;
            lp.s="test";
            
            if(hwndTest!=(IntPtr)0)
            {
                if (DateTime.Now.Second % 2 == 0)
                {
                    Win32API.SendMessage(hwndTest, 0x6013);//传递2个整型参数成功
                }
                if(DateTime.Now.Second % 3 == 0)
                {
                    Win32API.SendMessage(hwndTest, 0x615ref lp);//传递整型参数和结构类型成功,这个方法加以改变后可以传递对象
                }
                if(DateTime.Now.Second % 5 == 0)
                {
                    Win32API.SendMessage(hwndTest, 0x625ref cds);//传递整型参数和不定长的字符串成功
                }
                if(DateTime.Now.Second % 7 == 0)
                {
                    Win32API.PostMessage(hwndTest, 0x6356);//传递2个整型参数成功
                }
                if(DateTime.Now.Second % 9 == 0)
                {
                    Win32API.PostMessage(hwndTest, 0x643ref lp);//传递整型参数成功,但是传递参数lp失败,3可以传递成功。
                }
                if(DateTime.Now.Second % 11 == 0)
                {
                    Win32API.PostMessage(hwndTest, 0x653ref cds);//传递整型参数成功,传递参数cds失败,3可以传递成功。
                }
            }
            
            
        }
    }
}


//子窗体接收消息以及参数

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  Test : Form
    {
        Main main;
         public   Test ()
        {
             InitializeComponent ();
        }

         private   void   Test_Load ( object  sender, EventArgs e)
        {
            main =  this .Owner  as  Main;
            main.hwndTest =  this .Handle;
            
        }

        

         /// 重写窗体的消息处理函数DefWndProc,从中加入自己定义消息的检测的处理入口
         protected   override   void   DefWndProc ( ref  Message m)
        {
             switch  (m.Msg)
            {
                     //接收自定义消息MYMESSAGE,并显示其参数
                 case   0x60 :
                    {
                        label1.Text = DateTime.Now. ToString () +  "-"  + m.WParam. ToInt32 (). ToString () +  "-"  + m.LParam. ToInt32 (). ToString ();
                    }
                     break ;
                 case   0x61 :
                    {
                        Win32API.My_lParam ml =  new  Win32API. My_lParam ();
                        Type t = ml. GetType ();
                        ml = (Win32API.My_lParam)m. GetLParam (t);
                        label2.Text = DateTime.Now. ToString () +  "-"  + m.WParam. ToInt32 (). ToString () +  "-"  + ml.i. ToString ()+ ":" +ml.s;
                    }
                     break ;
                     case   0x62 :
                    {
                        Win32API.COPYDATASTRUCT mystr =  new  Win32API. COPYDATASTRUCT ();
                        Type mytype = mystr. GetType ();
                        mystr = (Win32API.COPYDATASTRUCT)m. GetLParam (mytype);
                         string  str2 = mystr.lpData;
                        label3.Text = DateTime.Now. ToString () +  "-"  + m.WParam. ToInt32 (). ToString () +  "-"  + str2;
                    }
                     break ;
                     case   0x63 :
                    {
                        label4.Text = DateTime.Now. ToString () +  "-"  + m.WParam. ToInt32 (). ToString () +  "-"  + m.LParam. ToInt32 (). ToString ();
                    }
                     break ;
                     case   0x64 :
                    {
                        Win32API.My_lParam ml =  new  Win32API. My_lParam ();
                        Type t = ml. GetType ();
                        ml = (Win32API.My_lParam)m. GetLParam (t);
                        label5.Text = DateTime.Now. ToString () +  "-"  + m.WParam. ToInt32 (). ToString () +  "-"  + ml.i. ToString ()+ ":" +ml.s;
                    }
                     break ;
                     case   0x65 :
                    {
                        Win32API.COPYDATASTRUCT mystr =  new  Win32API. COPYDATASTRUCT ();
                        Type mytype = mystr. GetType ();
                        mystr = (Win32API.COPYDATASTRUCT)m. GetLParam (mytype);
                         string  str2 = mystr.lpData;
                        label6.Text = DateTime.Now. ToString () +  "-"  + m.WParam. ToInt32 (). ToString () +  "-"  + str2;
                    }
                     break ;
                 default :
                     base . DefWndProc ( ref  m);
                     break ;
            }
        }

        
         private   void   button1_Click ( object  sender, EventArgs e)
        {
            main.hwndTest = (IntPtr) ( 0 );
             this . Close ();
        }

        



    }

    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值