winform接收自定义消息的实例
10年做winform开发时,用到一个调外部程序的例子:一个用C++写的程序update.exe 要用C#调用它返回的消息
update.exe 参数列表
/Log 决定是否将记录升级过程下来,即保存到文件update.log。需注意的是,如果系统项设置了关闭记录日志功能,这一项将不会起作用。
/Tray 设置界面中是否使用托盘功能。
/HWND:XXX 传递宿主的窗口句柄给升级程序。如果宿主想获取升级程序返回消息,必须设置这项。其中xxx为宿主的窗口句柄,十进制值。
/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();
{
//获取当前窗体句柄
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();
//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;
//定义消息
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:
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()==1)
MessageBox.Show("升级成功");
if (m.WParam.ToInt32() == 2)
{
MessageBox.Show("没有发现新版本");
}
break;
default: base.DefWndProc(ref m);
break;
}
}
{
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 位。