调用方法: Public ClassForm1 ClassForm1PrivatemyMsgQueueAsCustomMessageQueuePrivateSubButton1_Click()SubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimmsgAsNewCustomMessagemsg.Message=1msg.param=NewString("我的自定义消息ID:1")CustomMessageQueue.PostMessage(myMsgQueue,msg)EndSubPrivateSubButton2_Click()SubButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton2.ClickDimmsgAsNewCustomMessagemsg.Message=2myMsgQueue.PostMessage(msg)EndSubPrivateSubForm1_FormClosing()SubForm1_FormClosing(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.FormClosingEventArgs)HandlesMyBase.FormClosingmyMsgQueue.PostQuitMessage()EndSubPrivateSubForm1_Load()SubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadmyMsgQueue=NewCustomMessageQueue()myMsgQueue.StartThread()myMsgQueue.PerTranslateMessage=NewCustomMessageQueue.PerTranslateMessageHandler(AddressOfCustomMessageProc)EndSubPrivateFunctionCustomMessageProc()FunctionCustomMessageProc(ByRefmAsCustomMessage)AsBooleanIfm.Message=1ThenMessageBox.Show("我拦截到id=1的消息了。并且,就到此为止了。呵呵")ReturnTrueElseMessageBox.Show(m.Message.ToString)EndIfReturnFalseEndFunctionEndClass 自己的消息机制线程类 Public StructureCustomMessage StructureCustomMessagePublicMessageAsIntegerPublicparamAsObjectEndStructure Public ClassCustomMessageQueue ClassCustomMessageQueuePrivatethAsThreading.ThreadPublicMsgAsNewCustomMessagePublicDelegateFunctionPerTranslateMessageHandler()FunctionPerTranslateMessageHandler(ByRefmAsCustomMessage)AsBooleanPublicPerTranslateMessageAsPerTranslateMessageHandlerPublicSharedSubPostMessage()SubPostMessage(ByRefmsgQueueAsCustomMessageQueue,ByRefmAsCustomMessage)msgQueue.Msg=mThreading.Monitor.Enter(msgQueue)Threading.Monitor.Pulse(msgQueue)Threading.Monitor.Exit(msgQueue)EndSubPublicSubPostMessage()SubPostMessage(ByRefmAsCustomMessage)Msg=mThreading.Monitor.Enter(Me)Threading.Monitor.Pulse(Me)Threading.Monitor.Exit(Me)EndSubPublicSubPostQuitMessage()SubPostQuitMessage()Msg.Message=-1Threading.Monitor.Enter(Me)Threading.Monitor.Pulse(Me)Threading.Monitor.Exit(Me)EndSubPrivateSubThreadProc()SubThreadProc()WhileMsg.Message<>-1'enum-1forexitthreadIf(Msg.Message<>0)ThenIfNotPerTranslateMessageIsNothingThenIfPerTranslateMessage.Invoke(Msg)ThenMsg.Message=0'SetmessagetounusedThreading.Monitor.Enter(Me)Threading.Monitor.Wait(Me)Threading.Monitor.Exit(Me)ContinueWhileEndIfEndIfDefaultMessageTranslate()EndIfThreading.Monitor.Enter(Me)Threading.Monitor.Wait(Me)Threading.Monitor.Exit(Me)EndWhileEndSubPrivateSubDefaultMessageTranslate()SubDefaultMessageTranslate()'以下可以定义默认的消息处理,可以封装成自己要用的SelectCaseMsg.MessageCase1'我自己定义,1表示显示消息号或消息的解释IfNotMsg.paramIsNothingOrElseTypeOfMsg.paramIsStringThenMessageBox.Show(DirectCast(Msg.param,String))ElseDimstrMsgAsString=String.Format("{0:d}",Msg.Message)MessageBox.Show(strMsg)EndIfEndSelectMsg.Message=0'SetmessagetounusedEndSubPublicSubNew()SubNew()th=NewThreading.Thread(AddressOfThreadProc)PerTranslateMessage=NothingEndSubPublicSubStartThread()SubStartThread()Tryth.Start()CatchDimnLayerAsInteger=GC.GetGeneration(th)GC.Collect(nLayer)th=NewThreading.Thread(AddressOfThreadProc)th.Start()EndTryEndSubEndClass 带有消息机制的线程 - CustomMessageQueue (vb.net/c# 两种版本的源码)