C#中,可以自定义消息吗?

韩小明 2003-04-02 06:45:57
Delphi和VC中都可以,请问在C#中可以吗?谢谢
...全文
136 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
韩小明 2003-04-11
  • 打赏
  • 举报
回复
分不多,感谢大家来讨论!谢谢
韩小明 2003-04-11
  • 打赏
  • 举报
回复
同意
ixMind 2003-04-10
  • 打赏
  • 举报
回复
我想.Net里的消息有两种,
一是Message结构体,用于windows窗体
一是Message类,用于消息队列(MessageQueue)
不知道你想用那一种

对于windows消息,我想就是用API SendMessage
然后改写WndProc处理自定义的消息

对于MessageQueue,我没有用过,msdn对这东西讲的比较多

就像楼主所说的,消息机制和委托相比,
还有一个优点就是通信双方的松散耦合,
当然也有相应的缺点:参数和返回值的形式和含义只能在另外的地方“软性”定义
例如windows消息里的uMsg, lParam, wParam和lResult

我觉得象.Net这样的类库,一般都会倾向于使用Property-Method-Event
这些相对明确的接口形式来定义通信的协议,对于非常规的要求,反正
还有windows api等一些非常规手段可以满足要求

个人见解,敬请指正
ixMind 2003-04-09
  • 打赏
  • 举报
回复
.Net当然是希望使用“事件-委托”的机制而不是Message
虽然两者在本质上没有太大的差别,但使用方式还是挺不一样的
至少windows的消息机制相对较为低级,可能效率比较高,
但我想是不太适合于.net这样“现代”和高级的架构

如果要用的话,用上面提到的windows API和重栽WinProc应该可以搞定吧

当然还是推荐使用事件和委托,除非有别的什么原因...
想象SDK里WindowProc的臃肿还有MFC里MessageMap的复杂...
mamu 2003-04-09
  • 打赏
  • 举报
回复
mark
hillwell 2003-04-09
  • 打赏
  • 举报
回复
关注
韩小明 2003-04-09
  • 打赏
  • 举报
回复
关键在于:
消息可以不去理会接受方是否有处理。
委托却不可以做到啊。应该不光是效率问题。

另外:
.NET也是有消息的。Message这个组件就可以使用。
而进程间的通讯本就支持使用消息。

因为不管什么操作系统都有消息驱动啊。.NET如果想在多个平台上,支持消息是必然的。
gloomyfire 2003-04-07
  • 打赏
  • 举报
回复
1.定义一个包含事件信息的类.
2.定义一个delegate
3.定义一个delegate类型为2的event事件成员
4.定义一个事件来触发event成员
5.触发
韩小明 2003-04-07
  • 打赏
  • 举报
回复
好像每个对象有个消息队列是不是?可以Reciev和Send?
C#中的消息机制是怎样的呢?
engine_ 2003-04-07
  • 打赏
  • 举报
回复
mark
fspigigg 2003-04-06
  • 打赏
  • 举报
回复
可以直接引用windows的消息常量吗?
sysu 2003-04-05
  • 打赏
  • 举报
回复
public const int WM_USER = 0x400;
public const int WM_MYBUTTONCLICK = WM_USER + 100;

[DllImport("user32",EntryPoint="SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

protected override void WndProc(ref Message m)
{
if (m.Msg == WM_MYBUTTONCLICK)
{
MessageBox.Show("MyButton Click");
}
else
base.WndProc(ref m);
}

private void button1_Click(object sender, System.EventArgs e)
{
SendMessage(this.Handle, WM_MYBUTTONCLICK, 0, 0);
}
tms2000 2003-04-05
  • 打赏
  • 举报
回复
重载WndProc是处理消息呀,不是发消息
当然可以,用老的编程机制,吧SendMessageA PostMessageA Api导出来,发就ok了

zlcoolzl 2003-04-04
  • 打赏
  • 举报
回复
up
xxj 2003-04-04
  • 打赏
  • 举报
回复
重载WndProc
LYH1977 2003-04-04
  • 打赏
  • 举报
回复
是用委托事件实现的
yarshray 2003-04-03
  • 打赏
  • 举报
回复
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace userEvent
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public delegate void MYShow();

public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public event MYShow ShowME;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
this.ShowME();
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Name = "Form1";
this.Text = "Form1";
this.ShowME+=new MYShow(this.ShowMeName);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
void ShowMeName()
{
MessageBox.Show("I'm yarshray");
}
}
}



详细说明参考:

http://www.csdn.net/develop/read_article.asp?id=16267

yarshray 2003-04-03
  • 打赏
  • 举报
回复
当然,可以event和代理嘛

bluebirdboy 2003-04-03
  • 打赏
  • 举报
回复
protected void Eventname(object sender, System.Enventargs e)
{
//some codes for you!
}
40Star 2003-04-03
  • 打赏
  • 举报
回复
当然,微软开发的东西能不支持自己的消息么
加载更多回复(6)

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧