本文翻译自wuyazhe的VB版本,VB原文链接http://blog.csdn.net/wuyazhe/archive/2006/11/09/1375082.aspx 调用方法: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace view { public partial class Form4 : Form { public Form4() { InitializeComponent(); } private CustomMessageQueue myMsgQueue; private void Button1_Click(object sender, EventArgs e) { CustomMessage msg = new CustomMessage(); msg.Message = 1; msg.param = "我的自定义消息 ID:1"; CustomMessageQueue.PostMessage(ref myMsgQueue, ref msg); } private void Button2_Click(object sender, EventArgs e) { CustomMessage msg = new CustomMessage(); msg.Message = 2; myMsgQueue.PostMessage(ref msg); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { myMsgQueue.PostQuitMessage(); } private void Form1_Load(object sender, EventArgs e) { myMsgQueue = new CustomMessageQueue(); myMsgQueue.StartThread(); myMsgQueue.PerTranslateMessage = new CustomMessageQueue.PerTranslateMessageHandler(CustomMessageProc); } private bool CustomMessageProc(ref CustomMessage m) { if (m.Message == 1) { MessageBox.Show("我拦截到 id = 1 的消息了。并且,就到此为止了。呵呵"); return true; } else MessageBox.Show(m.Message.ToString()); return false; } } } 自己的消息机制线程类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.ServiceModel; using System.Windows.Forms; namespace view { public struct CustomMessage { public int Message; public object param; } public class CustomMessageQueue { private Thread th; public CustomMessage Msg; public delegate bool PerTranslateMessageHandler(ref CustomMessage m); public PerTranslateMessageHandler PerTranslateMessage; public static void PostMessage(ref CustomMessageQueue msgQueue, ref CustomMessage m) { msgQueue.Msg = m; Monitor.Enter(msgQueue); Monitor.Pulse(msgQueue); Monitor.Exit(msgQueue); } public void PostMessage(ref CustomMessage m) { Msg = m; Monitor.Enter(this); Monitor.Pulse(this); Monitor.Exit(this); } public void PostQuitMessage() { Msg.Message = -1; Monitor.Enter(this); Monitor.Pulse(this); Monitor.Exit(this); } private void ThreadProc() { while (Msg.Message != -1)// 'enum -1 for exit thread { if (Msg.Message != 0) { if (PerTranslateMessage != null) { if (PerTranslateMessage.Invoke(ref Msg)) { Msg.Message = 0;// 'Set message to unused Monitor.Enter(this); Monitor.Wait(this); Monitor.Exit(this); continue; } } DefaultMessageTranslate(); } Monitor.Enter(this); Monitor.Wait(this); Monitor.Exit(this); } } private void DefaultMessageTranslate() { //'以下可以定义默认的消息处理,可以封装成自己要用的 switch (Msg.Message) { case 1://"我自己定义,1表示显示消息号或消息的解释" if (Msg.param != null || Msg.param is String) MessageBox.Show(Msg.param.ToString()); else { String strMsg = String.Format("{0:d}", Msg.Message); MessageBox.Show(strMsg); } break; } Msg.Message = 0;//'Set message to unused } public void StartThread() { try { th = new Thread(new ThreadStart(ThreadProc)); PerTranslateMessage = null; th.Start(); } catch { int nLayer = GC.GetGeneration(th); GC.Collect(nLayer); th = new Thread(new ThreadStart(ThreadProc)); th.Start(); } } } }