消息传递的总结处理:
0.标识: public const int USER = 0x500;
public const int MYMESSAGE = USER + 1;
- IntPtr handle //定义窗体应用句柄
//调用方法:用来传递消息的时候指定需要处理消息的窗体
2.定义一个结构体(用于携带消息的类) (实际中可能是传递消息的实体:这个需要后面传递处理)
public struct My_lParam
{
public int i;
public string s;
}
3.定义发送消息的方法:
[DllImport(“User32.dll”, EntryPoint = “SendMessage”)]
private static extern int SendMessage(
IntPtr hWnd, // 信息发往的窗口的句柄
int Msg, // 消息ID (用于作标识)
int wParam, // 参数1
ref My_lParam lParam
);
4.定义查找类或者窗体的方法:
[DllImport(“User32.dll”, EntryPoint = “FindWindow”)]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
//第一个参数是查找类,第二个参数是根据窗体名查找窗体
5.以上涉及到的方法调用实例:
IntPtr ptr = FindWindow(null, “Form2”);//获取接收消息的窗体句柄
//消息构建(携带消息的实体)
My_lParam m = new My_lParam();
m.s = textBox1.Text;
m.i = m.s.Length;
//窗体、标识、参数1、携带消息的实体
SendMessage(ptr, MYMESSAGE, 1, ref m);//发送消息
6.接收需要处理的消息(接收消息的窗体界面):
protected override void DefWndProc(ref Message m) //WndProc //DefWndProc
{
switch (m.Msg)
{
case MYMESSAGE:
Form3.My_lParam ml = new Form3.My_lParam();
Type t = ml.GetType();
ml = (Form3.My_lParam)m.GetLParam(t);
label1.Text = ml.s;
MessageBox.Show("实现了数据的调用" + t);///显示一个消息框
break;
default:
base.DefWndProc(ref m); //DefWndProc(ref m)
break;
}
}
7.PostMessage只负责将消息放到消息队列中,不确定何时及是否处理
SendMessage要等到受到消息处理的返回码(DWord类型)后才继续
PostMessage执行后马上返回
SendMessage必须等到消息被处理后才会返回。
8.class ABC
{
public string ret { get; internal set; }
public string msg { get; internal set; }
public T data { get; internal set; }
}