在API中主对话框的处理函数是BOOL CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM)
可以处理WM_XXXX的消息处理,那么生成的线程可以处理WM_XXX或其他消息吗?
应该怎么做呢???

解决方案 »

  1.   

    线程也有消息队列,一样处理:MSG  msg;
    while(GetMessage(&msg, NULL, 0, -1))
    {
        switch(msg.message)
       {
        case WM_XXXX:
            ....
     
       }
    }
      

  2.   

    我用
    BOOL CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
    {
         DialogBox (hInstance, MAKEINTRESOURCE(IDD_MYDLG), 0, WndProc) ;
         return 0;
    }
    起动我的对话框,具体怎么添加线程呢?
    能说的确详细一点吗?
      

  3.   

    假如我在线程里使用的API函数会产生WM_XXXX消息,
    而我又想在该线程里处理这个消息,那怎么获得该消息呢?
      

  4.   

    工作者线程如果不带窗口.怎么接收窗口消息?线程里可以 PostThreadMessage, 将一条消息写入线程的消息队列.
    线程里处理消息,上面已经说了.
    ::PostThreadMessage(::GetCurrentThreadID(), 0x1234, 0,0);
      

  5.   

    这样说,线程里产生的消息是发给该线程的消息队列,
    还是进程的消息队列?
    举个例子:假如窗口处理函数是WinProc,并且在IDOK时创建#1线程,我在#1线程里调用WaveInOpen函数会自动产生MM_WIM_OPEN消息
    我在那里会收到MM_WIM_OPEN消息?是WinProc,还是#1线程?
      

  6.   

    对于WaveInOpen函数,这取决于fdwOpen参数,如果是CALLBACK_THREAD,你在线程收;如果是CALLBACK_WINDOW,你在WndPorc中收.
      

  7.   

    线程没有消息循环,只有窗口才有消息循环。不能称为消息队列,消息队列只有是又操作系统处理的,假如用户用鼠标点击button,那么操作系统就获得这个动作,然后发给发出WM_COMMAND命令,一般传给WinMain函数中的消息接受函数,GetMessage(&message, NULL, 0, 0),然后由TranslateMessage(&message)进行消息转换,包括窗口句柄等。然后在由PatchMessage(&message),发送到窗口函数。窗口函数根据不同的消息才得到真正的处理。而线程则没有窗口,那么就没有句柄,那来的消息处理。线程和线程通讯或者和窗口和线程通讯都要通过全局变量来访问,当然也可以通过事件同步信号量来处理线程之间的通讯,线程由操作系统来直接处理,对于对于多个线程,操作系统一般给每个线程分配固定的时间,大约是20毫秒吧。然后把权利转给其他线程,当然要根据优先级。