---恢复内容开始---
最近要写个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);
---恢复内容结束---