怎么样通过WIN32API来创建一个线程的消息队列啊?谢谢!

解决方案 »

  1.   

    不明白?
    但是你可以看看《深入浅出MFC》里面有很详细的介绍你这方面的知识~
      

  2.   

    调用任何与消息相关的API会自动初始化线程消息队列相关的数据结构//初始化线程消息队列
     PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
     
     while(GetMessage(&msg, NULL, 0, 0))
     {
         ...
     }
      

  3.   


    一个线程原本是没有消息队列的,当它创建了窗口或者调用与消息相关的函数,OS 才会为它创建一个消息队列。你可以随便创建一个队列,什么也不作,另一个进程给它发消息,肯定会返回给你一个错误;你再在它的里面创建一个窗口,或者就只是调用一个 GetMessage ,这时候外面就可以给它发消息了。
      

  4.   


    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR szHello[MAX_LOADSTRING];
    LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) 
    {
    case WM_COMMAND:
    wmId    = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
       DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
       break;
    case IDM_EXIT:
       DestroyWindow(hWnd);
       break;
    default:
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    RECT rt;
    GetClientRect(hWnd, &rt);
    DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
       }
       return 0;
    }这个是回调函数WndProc,在注册窗体时用到ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX);  wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = (WNDPROC)WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_DDD);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = (LPCSTR)IDC_DDD;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex);
    }
    WinMain中会有消息翻译的循环 while (GetMessage(&msg, NULL, 0, 0)) 
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }楼主创建个HelloWorld不就看到了?
      

  5.   

    是这样的,LINUX下可以直接创建消息队列的,所以我想看看WIN32下是否有这样的操作,
    我有代码想移植到WIN32下来的
      

  6.   

    操作系统将消息填充为一个MSG结构,然后把它发送给线程消息队列。MSG结构包括:消息传递的窗口的句柄;消息标识;两个消息参数,操作系统发送消息的时间,和鼠标的位置。线程使用PostMessage和PostThreadMessage函数将消息发送到自己或其它线程的消息队列。
    应用程序用GetMessage函数将消息从消息队列中清除。如果消息不从消息队列中清除,可以使用PeekMessage函数,这个函数根据消息填充一个MSG结构。应用程序移出一个消息后,可以用DispatchMessage函数让操作系统将消息发送给消息窗口去处理。DispatchMessage函数有一个指向由GetMessage或PeekMessage填充的MSG结构的指针参数,它将窗口句柄,消息标识和两个消息参数传递给窗口过程,不传递发送时间和鼠标光标位置。应用程序处理消息时,可以用GetMessageTime和GetMessagePos函数来取得传递时间和鼠标位置。当没有消息处理时,线程用WaitMessage函数将系统控制权交给其它线程,这个函数让线程悬停直到有消息填充到线程的消息队列中。
    使用SetMessageExtraInfo函数来让一个32位值与现行线程的消息队列连接起来,然后用GetmessageExtraInfo函数得到GetMessage或PeekMessage返回的最后的消息。