发送消息给线程

采用PostThreadMessage即可
BOOL PostThreadMessage(
  DWORD idThread,     //线程ID,通过创建线程后的id
  UINT  Msg,           //消息id
  WPARAM wParam,    
  LPARAM lParam);
然后在线程通过GetMessage or PeekMessage去获取该消息.

代码片段如下:
unsigned int CALLBACK thread_func(LPVOID lp)
{
while(1)
{
MSG msg;
while (GetMessage(&msg, NULL,  0, 0)) 
//while (PeekMessage(&msg, NULL,  0, 0,PM_REMOVE)) 
switch(msg.message) 
case WM_MYMESSAGE:
printf("\n *thread_func1:%d", msg.wParam);
break;
}
        } 
}
其中发送线程片段如下:
UINT dwId
_beginthreadex(NULL, 0, thread_func, NULL, 0, &dwId);
        ...
附:
GetMessage(LPMSG lpMsg,  HWND hWnd,   UINT wMsgFilterMin,   UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg,  HWND hWnd,   UINT wMsgFilterMin,   UINT wMsgFilterMax,UINT wRemoveMsg)
    参数wRemoveMsg的作用是指定消息获取的方式,如果设为PM_NOREMOVE,那么消息将不会从消息队列中被移出,如果设为PM_REMOVE,那么消息将会从消息队列中被移出;
    两个函数主要有以下两个区别: 
    1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。(GetMessage 处于挂起等待消息来,而PeekMessage则不管有不有消息都返回)
    2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。(如果保留在队列中,最好立即处理)
      在Windows的内部,GetMessage和PeekMessage执行着相同的代码。而两者最大的不同之处则体现在没有任何消息返回到应用程序的情况下。在此种情况下,PeekMessage会返回一个空值到应用程序,GetMessage会在此时让应用程序休眠。
(如果在线程中使用,用GetMessage or PeekMessage都无所谓,不需要考虑消息队列的remove,消息队列在各个线程中不过是个拷贝?而已.)
原文地址:https://www.cnblogs.com/kex1n/p/2104929.html