怎么样通过WIN32API来创建一个线程的消息队列啊? 怎么样通过WIN32API来创建一个线程的消息队列啊?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不明白?但是你可以看看《深入浅出MFC》里面有很详细的介绍你这方面的知识~ 调用任何与消息相关的API会自动初始化线程消息队列相关的数据结构//初始化线程消息队列 PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); while(GetMessage(&msg, NULL, 0, 0)) { ... } 一个线程原本是没有消息队列的,当它创建了窗口或者调用与消息相关的函数,OS 才会为它创建一个消息队列。你可以随便创建一个队列,什么也不作,另一个进程给它发消息,肯定会返回给你一个错误;你再在它的里面创建一个窗口,或者就只是调用一个 GetMessage ,这时候外面就可以给它发消息了。 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不就看到了? 是这样的,LINUX下可以直接创建消息队列的,所以我想看看WIN32下是否有这样的操作,我有代码想移植到WIN32下来的 操作系统将消息填充为一个MSG结构,然后把它发送给线程消息队列。MSG结构包括:消息传递的窗口的句柄;消息标识;两个消息参数,操作系统发送消息的时间,和鼠标的位置。线程使用PostMessage和PostThreadMessage函数将消息发送到自己或其它线程的消息队列。应用程序用GetMessage函数将消息从消息队列中清除。如果消息不从消息队列中清除,可以使用PeekMessage函数,这个函数根据消息填充一个MSG结构。应用程序移出一个消息后,可以用DispatchMessage函数让操作系统将消息发送给消息窗口去处理。DispatchMessage函数有一个指向由GetMessage或PeekMessage填充的MSG结构的指针参数,它将窗口句柄,消息标识和两个消息参数传递给窗口过程,不传递发送时间和鼠标光标位置。应用程序处理消息时,可以用GetMessageTime和GetMessagePos函数来取得传递时间和鼠标位置。当没有消息处理时,线程用WaitMessage函数将系统控制权交给其它线程,这个函数让线程悬停直到有消息填充到线程的消息队列中。使用SetMessageExtraInfo函数来让一个32位值与现行线程的消息队列连接起来,然后用GetmessageExtraInfo函数得到GetMessage或PeekMessage返回的最后的消息。 XML文件读取 使用FrameRect画矩形框,一闪而过 msxml的get_text得到的字符串要自己release吗 《讨论》:参数转换 10分求解XP中刻录功能的COM接口? 求一加密算法!!!!!!!!100分 共享内存的问题,用VC共享内存后,保存一些数据,让JAVA程序能使用这些数据呢??? 标签控件的问题 请指教:一按“取消”就出错,谢谢! 请问nlc格式的文件怎么打开 vfw如何用VC++将DIB图转换成数组并将此数组显示出来 头文件中结构体别名重复定义怎么办?
但是你可以看看《深入浅出MFC》里面有很详细的介绍你这方面的知识~
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
while(GetMessage(&msg, NULL, 0, 0))
{
...
}
一个线程原本是没有消息队列的,当它创建了窗口或者调用与消息相关的函数,OS 才会为它创建一个消息队列。你可以随便创建一个队列,什么也不作,另一个进程给它发消息,肯定会返回给你一个错误;你再在它的里面创建一个窗口,或者就只是调用一个 GetMessage ,这时候外面就可以给它发消息了。
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不就看到了?
我有代码想移植到WIN32下来的
应用程序用GetMessage函数将消息从消息队列中清除。如果消息不从消息队列中清除,可以使用PeekMessage函数,这个函数根据消息填充一个MSG结构。应用程序移出一个消息后,可以用DispatchMessage函数让操作系统将消息发送给消息窗口去处理。DispatchMessage函数有一个指向由GetMessage或PeekMessage填充的MSG结构的指针参数,它将窗口句柄,消息标识和两个消息参数传递给窗口过程,不传递发送时间和鼠标光标位置。应用程序处理消息时,可以用GetMessageTime和GetMessagePos函数来取得传递时间和鼠标位置。当没有消息处理时,线程用WaitMessage函数将系统控制权交给其它线程,这个函数让线程悬停直到有消息填充到线程的消息队列中。
使用SetMessageExtraInfo函数来让一个32位值与现行线程的消息队列连接起来,然后用GetmessageExtraInfo函数得到GetMessage或PeekMessage返回的最后的消息。