{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
![](http://image71.360doc.com/DownloadImg/2014/03/2514/40225103_1.gif)
private CustomMessageQueue myMsgQueue;
private bool CustomMessageProc(ref CustomMessage m)
{
if (m.Message == 1)
{
MessageBox.Show("我拦截到 id = 1 的消息了。并且,就到此为止了。呵呵");
return true;
}
else
{
MessageBox.Show(m.Message.ToString());
}
return false;
}
![](http://pubimage.360doc.com/wz/default.gif)
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);
}
![](http://pubimage.360doc.com/wz/default.gif)
private void Button2_Click(object sender, EventArgs e)
{
CustomMessage msg = new CustomMessage();
msg.Message = 2;
myMsgQueue.PostMessage(ref msg);
}
![](http://pubimage.360doc.com/wz/default.gif)
private void Form1_Load(object sender, EventArgs e)
{
myMsgQueue = new CustomMessageQueue();
myMsgQueue.StartThread();
myMsgQueue.PerTranslateMessage = new CustomMessageQueue.PerTranslateMessageHandler(CustomMessageProc);
}
![](http://pubimage.360doc.com/wz/default.gif)
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
myMsgQueue.PostQuitMessage();
}
}
![](http://pubimage.360doc.com/wz/default.gif)
#region 自定义消息队列线程
public struct CustomMessage
{
public int Message;
public Object param;
}
![](http://pubimage.360doc.com/wz/default.gif)
public class CustomMessageQueue
{
private System.Threading.Thread th;
public CustomMessage Msg = new CustomMessage();
public delegate bool PerTranslateMessageHandler(ref CustomMessage m);
public PerTranslateMessageHandler PerTranslateMessage;
![](http://pubimage.360doc.com/wz/default.gif)
public static void PostMessage(ref CustomMessageQueue msgQueue, ref CustomMessage m)
{
msgQueue.Msg = m;
System.Threading.Monitor.Enter(msgQueue);
System.Threading.Monitor.Pulse(msgQueue);
System.Threading.Monitor.Exit(msgQueue);
}
![](http://pubimage.360doc.com/wz/default.gif)
public void PostMessage(ref CustomMessage m)
{
Msg = m;
System.Threading.Monitor.Enter(this);
System.Threading.Monitor.Pulse(this);
System.Threading.Monitor.Exit(this);
}
![](http://pubimage.360doc.com/wz/default.gif)
public void PostQuitMessage()
{
Msg.Message = -1;
System.Threading.Monitor.Enter(this);
System.Threading.Monitor.Pulse(this);
System.Threading.Monitor.Exit(this);
}
![](http://pubimage.360doc.com/wz/default.gif)
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
System.Threading.Monitor.Enter(this);
System.Threading.Monitor.Wait(this);
System.Threading.Monitor.Exit(this);
continue;
}
}
DefaultMessageTranslate();
}
System.Threading.Monitor.Enter(this);
System.Threading.Monitor.Wait(this);
System.Threading.Monitor.Exit(this);
}
}
![](http://pubimage.360doc.com/wz/default.gif)
private void DefaultMessageTranslate()
{
//以下可以定义默认的消息处理,可以封装成自己要用的
switch (Msg.Message)
{
case 1: //我自己定义,1表示显示消息号或消息的解释
if (Msg.param != null)
{
if (Msg.param is string)
{
MessageBox.Show(Msg.param as string);
}
}
else
{
string strMsg = string.Format("{0:d}", Msg.Message);
MessageBox.Show(strMsg);
}
break;
}
Msg.Message = 0; //Set message to unused
}
![](http://pubimage.360doc.com/wz/default.gif)
public CustomMessageQueue()
{
th = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
PerTranslateMessage = null;
}
![](http://pubimage.360doc.com/wz/default.gif)
public void StartThread()
{
try
{
th.Start();
}
catch
{
int nLayer = GC.GetGeneration(th);
GC.Collect(nLayer);
th = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
th.Start();
}
}
}
#endregion
}
|