---恢复内容开始---

最近要写个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);

 

 

---恢复内容结束---

posted on 2013-09-23 20:16  EM_C  阅读(1012)  评论(0编辑  收藏  举报