winform接收自定义消息的实例

10年做winform开发时,用到一个调外部程序的例子:一个用C++写的程序update.exe 要用C#调用它返回的消息
 
update.exe 参数列表
/Log 决定是否将记录升级过程下来,即保存到文件update.log。需注意的是,如果系统项设置了关闭记录日志功能,这一项将不会起作用。
/Tray 设置界面中是否使用托盘功能。
/HWND:XXX 传递宿主的窗口句柄给升级程序。如果宿主想获取升级程序返回消息,必须设置这项。其中xxx为宿主的窗口句柄,十进制值。
 
升级程序要知道是谁在调用它,并把消息返回给宿主程序,用句柄标志
 
1。找到调用它窗体的句柄
2。带参数启动update.exe,并把句柄值给  /HWND:XXX
3.用C#自定义消息,接收update.exe 的消息
 
 
调试的代码:
 private void Form1_Load(object sender, EventArgs e)
        {
            //获取当前窗体句柄
            int jb=this.Handle.ToInt32();
            Process p = new Process();
            //update.exe /Log /Tray /HWND:460310
            p.StartInfo.FileName = "update.exe";
            p.StartInfo.Arguments = "/Tray /HWND:"+jb.ToString();
            p.Start();
        }
        #region 定义与接收自定义消息
        //定义消息
        public const int USER = 0x0400;
        public const int WM_USER = USER + 999;
       
       //接收
        protected override void DefWndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_USER:
                    //返回-1未成功     返回1成功   返回2表示没有发现新版本  返回3表示发现新版本
                    if(m.WParam.ToInt32()==1)
                    MessageBox.Show("升级成功");
                    if (m.WParam.ToInt32() == 2)
                    {
                        MessageBox.Show("没有发现新版本");  
                    }
                    break;
                default: base.DefWndProc(ref m);
                    break;
            }
           
        }
        #endregion
 
 

需要了解的知识

有2个参数,“WParam”和“LParam”,这2个参数可以给我们消息处理所需要的重要信息,在以前,电脑还是16位的时候,每条消息能附带2个数据,就是“WParam”和“LParma”,“WParam”只是一个16位的数据,也就是“word”数据类型,所以我们叫它“W”;而“LParam”却是一个32位的数据,也就是“Long”数据类型,所以我们叫它“L”。当使用它们的时候,我们把句柄和整数传递给“WParam”,而把指针传递给“LParam”。
这是最早的时候我们这样给它们命名了,然后当电脑发展到32位时,“WParam”也升级到了32位,虽然“W”还是表示“word”,但是它已经不是word类型了。(tury注:查阅MSDN,在.net framework类库中,Message类的2个属性都被定义成了IntPtr类型,再看IntPtr类的介绍:类型被设计成整数,其大小适用于特定平台。即是说,此类型的实例在 32 位硬件和操作系统中将是 32 位,在 64 位硬件和操作系统上将是 64 位。 

 
 
posted @ 2012-06-03 10:34  奎宇工作室  阅读(403)  评论(0编辑  收藏  举报