采用PostThreadMessage即可
BOOL PostThreadMessage(
DWORD idThread, //線程ID,通過創(chuàng)建線程后的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;
}
}
}
}
其中發(fā)送線程片段如下:
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)
參數(shù)wRemoveMsg的作用是指定消息獲取的方式,如果設(shè)為PM_NOREMOVE,那么消息將不會從消息隊列中被移出,如果設(shè)為PM_REMOVE,那么消息將會從消息隊列中被移出;
兩個函數(shù)主要有以下兩個區(qū)別:
1.GetMessage將等到有合適的消息時才返回,而PeekMessage只是撇一下消息隊列。(GetMessage 處于掛起等待消息來,而PeekMessage則不管有不有消息都返回)
2.GetMessage會將消息從隊列中刪除,而PeekMessage可以設(shè)置最后一個參數(shù)wRemoveMsg來決定是否將消息保留在隊列中。(如果保留在隊列中,最好立即處理)
在Windows的內(nèi)部,GetMessage和PeekMessage執(zhí)行著相同的代碼。而兩者最大的不同之處則體現(xiàn)在沒有任何消息返回到應(yīng)用程序的情況下。在此種情況下,PeekMessage會返回一個空值到應(yīng)用程序,GetMessage會在此時讓應(yīng)用程序休眠。
(如果在線程中使用,用GetMessage or PeekMessage都無所謂,不需要考慮消息隊列的remove,消息隊列在各個線程中不過是個拷貝?而已.)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1573835