在项目中有这样的需求,在主窗体隐藏时或者主进程运行时对其它窗体的控件或者事件进行控制,而且其它窗体是处于活动状态,而主窗体或者主进程是隐藏在后面的。这个时候使用句柄和消息来处理就比较好解决这些问题了,当然了也可以使用其它方法。比如将其它窗体在主窗体中申明并且定义,使之和主窗体一样一直存在于内存中,在各个窗体中申明公共方法,在主进程需要调用时直接调用即可,但是这样耗费了大量的系统资源。现在使用消息来解决这个问题。下面提供一个小程序,在主窗体中通过句柄和消息来控制子窗体中Label上文字变化和颜色,代码如下:
Windowns的API类
usingSystem;
usingSystem.Runtime.InteropServices;
namespaceTestHwnd
{
publicclassWin32API
{
[DllImport("user32.dll ",CharSet = CharSet.Unicode)]
publicstaticexternIntPtrPostMessage(IntPtr hwnd,intwMsg,stringwParam,stringlParam);
}
}
主窗体程序(发送消息):
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Runtime.InteropServices;
namespaceTestHwnd
{
publicpartialclassMain : Form
{
//定义了一个子窗体的句柄
publicIntPtr hwndfrmTest;
publicMain()
{
InitializeComponent();
}
privatevoidtimer1_Tick(objectsender,EventArgs e)
{
if(hwndfrmTest!=(IntPtr)0)
{
if(DateTime.Now.Second%3==0)
{
Win32API.PostMessage(hwndfrmTest,0x60,"","");
}
if(DateTime.Now.Second%5==0)
{
Win32API.PostMessage(hwndfrmTest,0x61,"","");
}
}
}
voidButton2Click(objectsender,EventArgs e)
{
frmTest frm=newfrmTest();
frm.Show(this);
}
}
子窗体程序(接收消息)
usingSystem;usingSystem.Drawing;
usingSystem.Windows.Forms;
namespaceTestHwnd
{
///<summary>
///Description of frmTest.
///</summary>
publicpartialclassfrmTest : Form
{
Main main;
publicfrmTest()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
//
//TODO: Add constructor code after the InitializeComponent() call.
//
}
voidFrmTest_Load(objectsender,EventArgs e)
{
main =this.OwnerasMain;
//初始化该窗体的句柄
}
///重写窗体的消息处理函数DefWndProc,从中加入自己定义消息 MYMESSAGE 的检测的处理入口
protectedoverridevoidDefWndProc(refMessage m)
{
switch(m.Msg)
{
case0x60:
{
label1.ForeColor=Color.Red;
label1.Text = DateTime.Now.ToString()+"-"+"测试成功。。。。,呵呵,变红了";
}
break;
case0x61:
{
label1.ForeColor=Color.Blue;
label1.Text = DateTime.Now.ToString()+"-"+"测试成功。。。。,呵呵,变蓝了";
}
break;
default:
base.DefWndProc(refm);
break;
}
}
voidButton1Click(objectsender,EventArgs e)
{
main.hwndfrmTest =(IntPtr)(0);
this.Close();
}
}
}
}
本文介绍了一种在主窗体隐藏时通过句柄和消息控制其他活跃窗体的方法,避免了大量系统资源的消耗。示例程序展示了如何在主窗体中改变子窗体Label的文字和颜色。
592

被折叠的 条评论
为什么被折叠?



