---恢复内容开始---
最近要写个WinFrom客户端应用程序,无奈VC早已经忘记得差不多了。只能靠类似java的C#来写,后来写到后台与窗体交互的时候有了问题,本来想到用回调函数和托管的。
后来想到Android里面有Handler机制,WinFrom应该也有。上网查了点资料,也解决了这个问题,这个可用于窗体与窗体发送消息进行通信,主要是与界面进行交互。
首先,窗体要接收别出来的消息,必须重写DefWndProc方法,如下:
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
//MESSAGEXXX是在后面MESSAGE类定义的常量
case Message.MESSAGEXXX:
{
//TODO 这里处理消息
break;
}
case Message.MESSAGEOOO:
{
//TODO 这里处理消息
break;
}
default:
base.DefWndProc(ref m);
break;
}
}
然后实现一个消息发送的累Message,这里需要用的Win32里面的动态链接库user32.dll。
class Message { [DllImport("user32.dll", EntryPoint = "PostMessage")] //PostMessage也可以换成SendMessage,主要是user32.dll里面的函数 private static extern int PostMessage( int hwnd, // 窗体句柄 int msg, // 需要发送的消息,为整形 int wparam, // int lparam // 后连个变量可作为传递参数之用 ); [DllImport("user32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpclassname, string lpwindowname);//搜索发送消息的目标窗体 //定义消息常数 用来标志处理哪类消息的参数 public const int MESSAGEXXX= 1; public const int MESSAGECCC= 0; /// <summary> /// 向窗体发送消息的函数 /// </summary> /// <param name="msg"></param> public void SendMessage(int msg) { int window_handler = FindWindow(null, "ImporterManagerForm");//这里后面字符串代表的是要搜索的窗体,获得窗体句柄 if (window_handler == 0)//不存在当前窗体 { } else PostMessage(window_handler, msg, 100, 200); //发送消息 }
}
然后再别的窗体就可以发送消息过去了
Message msg=new Message(); msg.SendMessage(Message.MESSAGEXXX);
---恢复内容结束---