starnet 阅读(880) 评论(4)

GetMessage()从调用线程的消息队列中取消息,如果队列空就阻塞。

代码如下:

DWORD __stdcall PostMess(LPVOID lp);

void CTMsgDlg::OnBnClickedButton1()
{
 // TODO: 在此添加控件通知处理程序代码
    hThreadPM= CreateThread(NULL, 0, PostMess, NULL, 0, &dwThreadId);
   
}

void CTMsgDlg::OnBnClickedButton2()
{
 // TODO: 在此添加控件通知处理程序代码
 PostThreadMessage(dwThreadId,8888,0,0);
}

 

MSG message;

DWORD __stdcall PostMess(LPVOID lp)
{
 
    while(::GetMessage(&message, NULL, 0, 0))
    {
        ::TranslateMessage(&message);
        ::DispatchMessage(&message);
        switch(message.message)
        {
        case 8888:
   ::Beep(100,100);
            break;
  }
 }
 return 0;

}


评论列表
梆菜
应该是多于的
TranslateMessage(),DispatchMessage()是多于的。
student
系统不给线程发消息吗?如果发的话没有这两个是不是就。。。
系统消息得不到处理呢?
我想应该发的,那么消息不到线程队列?
gaoqing000
re: 我会发线程消息了
newboy686
re: 我会发线程消息了
MSDN中关于PostThreadMessage()里是这么说的, The thread to which the message is posted must have created a message queue, or else the call to PostThreadMessage fails. 就是, 你的非窗口线程中要想接收到消息, 必须有各消息队列, 否则PostThreadMessage()会失败, 返回的错误会是ERROR_INVALID_THREAD_ID. 可以用PeekMessage((&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)来建立一个消息队列.

发表评论
切换编辑模式