一个简单的自定义事件的例子
来源:互联网 发布:淘宝天杞园特膳 编辑:程序博客网 时间:2024/05/17 20:27
windows 应用程序是靠消息驱动的,在WinForm开发中经常会通过重写WndProc或DefWndProc方法来截获消息,以添加自己的处理。
当然我们也可以定义自己的消息,发送,然后截获处理。
其意义这里不做讨论,这里仅提供一种处理问题的方法。
通过下边这个例子,可以大致了解其过程,当然这个例子没有什么实际意义:
在一个Form中有两个按钮:
给自己发消息
给别人发消息
点击【给自己发消息】,发送消息到自身窗口,弹出提示框
点击【给别人发消息】,发送消息到标题为RecieveMsgform的窗口,并在窗口的label控件显示信息。
public partial class DefMsgForm : Form
{
//Windows提供的自定义消息最小值
const int WM_USER = 0x0400;
//定义一个自定义消息,因为需要新的Windows特性也使用了WM_User,微软建议要比这个值大100以上
const int WM_MyMessage = WM_USER + 101;
//使用SendMessageAPI发送消息
[DllImport("user32")]
static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
//使用FindWindow找到要发消息的窗口
//这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个
//在Win32 API中还有一个FindWindowEx,它非常适合寻找子窗口。
[DllImport("user32", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
//构造函数
public DefMsgForm()
{
InitializeComponent();
}
//当按钮被点击的时候,发送一个自定义消息
private void button1_Click(object sender, EventArgs e)
{
//给自己发消息
SendMessage(this.Handle, WM_MyMessage, 100, 200);
}
protected override void DefWndProc(ref Message m)
{
base.DefWndProc(ref m);
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
//判断是不是自定义消息
if (m.Msg == WM_MyMessage)
{
MessageBox.Show("我接收到消息了");
}
}
private void button2_Click(object sender, EventArgs e)
{
//找到标题为RecieveMsgform的窗口,并给它发消息
IntPtr fHandle = FindWindow(null, "RecieveMsgform");
if (fHandle != IntPtr.Zero)
{
SendMessage(fHandle, WM_MyMessage, 100, 200);
}
else
{
MessageBox.Show("没有找到要发送消息的窗口!");
}
}
}
//接收消息的窗口
public partial class RecieveMsgform : Form
{
const int WM_USER = 0x0400;
//自定义消息
const int WM_MyMessage = WM_USER + 101;
public RecieveMsgform()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
//接到自定义消息,显示信息
if (m.Msg == WM_MyMessage)
{
label1.Text = "我收到消息了";
}
}
}
通过贴出的代码,可以大致了解到自定义消息的具体使用。
附SendMessage与PostMessage的区别:
SendMessage把消息直接发送到窗口,并调用此窗口的相应消息处理函数,等消息处理函数结束后SendMessage才返回,SendMessage函数有返回值;
PostMessage将消息发送到与创建窗口的线程相关联的消息队列后立即返回;PostMessage函数没有返回值。
- 一个简单的自定义事件的例子
- 自定义事件的一个例子js
- 一个C# 事件的简单例子
- 事件监听器模式(一个简单的例子)
- 一个最简单的C#事件例子
- 一个最简单的C#事件例子
- 一个最简单的C#事件例子
- 自定义事件的例子
- 一个Java写的自定义的事件监听器例子
- 一个简单的javascript事件监听的例子
- 一个简单的动态绑定事件的例子
- Delphi 自定义事件的例子
- SVM 自定义kernel的一个简单的code 例子
- 关于自定义特性的一个简单的小例子
- 一个简单的例子
- 分享一个简单的iphone自定义状态栏例子
- IOS:最简单一个使用自定义的TableViewCell例子
- 事件监听的简单例子
- http://www.gitguys.com/topics/branches-visualizing/
- windows下的实时音频传输
- 把系统时间的秒数转化成年月日格式
- 怎么样生成一个随机数
- 如何使用SQL Profiler 性能分析器
- 一个简单的自定义事件的例子
- C/C++从入门到高手所有必备PDF书籍收藏,喜欢的朋友支持下吧~
- B树、B-树、B+树、B*树
- KVM/QEMU简介
- AXURE 学习笔记 制作“鼠标点击时,输入框内文字消失”效果
- Objective-C中单例类的声明
- java将对象列表中的某个属性转换成List或Map
- HTML5 拼图游戏
- SQL中OpenDataSource与OpenRowSet的应用