在项目中有这样的需求,在主窗体隐藏时或者主进程运行时对其它窗体的控件或者事件进行控制,而且其它窗体是处于活动状态,而主窗体或者主进程是隐藏在后面的。这个时候使用句柄和消息来处理就比较好解决这些问题了,当然了也可以使用其它方法。比如将其它窗体在主窗体中申明并且定义,使之和主窗体一样一直存在于内存中,在各个窗体中申明公共方法,在主进程需要调用时直接调用即可,但是这样耗费了大量的系统资源。现在使用消息来解决这个问题。下面提供一个小程序,在主窗体中通过句柄和消息来控制子窗体中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;
//初始化该窗体的句柄
main.hwndfrmTest =
this.Handle;
}
///重写窗体的消息处理函数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();
}
}
}
}
分享到:
相关推荐
C#winform窗体间传值,三种方法示例,注释详细。使用方法:使用vs2013打开编译运行即可; 工程中总共介绍了三种方法: ###方法1:通过保存对象的引用调用其方法实现对子窗体的控制; ###方法2:通过委托,在子窗体...
C#分割窗体C#分割窗体C#分割窗体C#分割窗体C#分割窗体C#分割窗体
C#中在一个窗体里调用另一个窗体的方法;C#不同窗体方法调用
C#编程 WinForm窗体开发 Selected(源码)C#编程 WinForm窗体开发 Selected(源码)C#编程 WinForm窗体开发 Selected(源码)C#编程 WinForm窗体开发 Selected(源码)C#编程 WinForm窗体开发 Selected(源码)C#编程 WinForm...
C#中窗体Form的美化 VS足够强大,强大到只需动动鼠标就可以写出个基本的界面出来,但是其自带的控件都是千篇一律的样式,对于追求完美的我而言,实在是忍不下去了,只好自己亲自动手对其进行改造----继承已有的控件...
本例子: 在子窗体中定义:委托与事件, 在父窗体中实现定义的事件。 实现子窗体,修改父窗体中的内容,及窗体之间的传值,都可以参考此例子。
提供了一个C#中主窗体Panel中加载其他多个窗体Panel控件的办法
C# winform 子窗体调用父窗体函数实现关闭该窗体打开另一个窗体;在父窗体分From1内嵌一个panel1,在panel1里载入From2,点击在子窗体From2中的按钮,清除panel1里的From2,新载入From3,点击在子窗体From3中的按钮...
C# 使用委托方式Usercontrol与主窗体进行消息传递
C#编程 WinForm窗体开发 DynamicTaskStock(源码)C#编程 WinForm窗体开发 DynamicTaskStock(源码)C#编程 WinForm窗体开发 DynamicTaskStock(源码)C#编程 WinForm窗体开发 DynamicTaskStock(源码)C#编程 WinForm窗体...
C#,窗体,最小化,事件 C#,窗体,最小化,事件 C#,窗体,最小化,事件 C#,窗体,最小化,事件 C#,窗体,最小化,事件 C#,窗体,最小化,事件 C#,窗体,最小化,事件
C# 不规则窗体 C# 不规则窗体
一个小Demo,一个主窗体中通过按钮实现 三个子窗体的切换显示,三个子窗体的切换的过程中,其窗体上的数据不会丢失。
C#编程 WinForm窗体开发 BuildNumber(源码)C#编程 WinForm窗体开发 BuildNumber(源码)C#编程 WinForm窗体开发 BuildNumber(源码)C#编程 WinForm窗体开发 BuildNumber(源码)C#编程 WinForm窗体开发 BuildNumber(源码)...
c# 窗体间图片传递 c# 窗体间图片传递 适合初学者学习
C#通过子窗体刷新父窗体 代码,vs2008.
C#中实现窗体间的数据传递
C# 使用Usercontrol与主窗体进行消息传递,利用Usercontrol里面的控件控制主窗体上的控件;利用主窗体的控件改变Usercontrol里面控件的属性
C#winform判断窗体是否打开 更适用于mdi
C#源码,窗体刷新,C#通过子窗体刷新