1、谁拥有消息队列
拥有消息队列的不是进程、也不是窗口,是线程,每一个线程都有自己的消息队列。而窗口则也是属于创建它的闲扯的
2、消息队列是什么时候建立的
一个线程不是一定有消息队列的,只有在user或gdi这两个系统dll中的api第一次被调用时才建立消息队列。
3、消息队列最大有多大?可不可以更大
默认消息队列的大小是10000,这个最大值最小可以设为4000。
修改如下注册表项可以更改其值:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Windows/USERPostMessageLimit.
不建议将此队列值改大。
4、如何给指定线程发送消息
PostThreadMessage
此函数立即返回,并不等待处理完该消息。连消息是否收到也不保证。比如接收线程消息队列不存在的话就会失败。
5、DispatchMessage的作用
将消息队列中的消息分派给不同窗口的窗口过程处理。因此,对于没有与窗口关联的消息,将会被此函数丢弃。比如使用PostThreadMessage发送的消息。但有一个例外,WM_TIMER消息,如果其LPARAM不为空,则说明其指向一个timer函数,DispatchMessage函数将调用该函数。
6、最简单的消息循环
Creating a Message Loop
rel="STYLESHEET" href="../backsdk4.css"><script src="../langref.js"></script>
拥有消息队列的不是进程、也不是窗口,是线程,每一个线程都有自己的消息队列。而窗口则也是属于创建它的闲扯的
2、消息队列是什么时候建立的
一个线程不是一定有消息队列的,只有在user或gdi这两个系统dll中的api第一次被调用时才建立消息队列。
3、消息队列最大有多大?可不可以更大
默认消息队列的大小是10000,这个最大值最小可以设为4000。
修改如下注册表项可以更改其值:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Windows/USERPostMessageLimit.
不建议将此队列值改大。
4、如何给指定线程发送消息
PostThreadMessage
此函数立即返回,并不等待处理完该消息。连消息是否收到也不保证。比如接收线程消息队列不存在的话就会失败。
5、DispatchMessage的作用
将消息队列中的消息分派给不同窗口的窗口过程处理。因此,对于没有与窗口关联的消息,将会被此函数丢弃。比如使用PostThreadMessage发送的消息。但有一个例外,WM_TIMER消息,如果其LPARAM不为空,则说明其指向一个timer函数,DispatchMessage函数将调用该函数。
6、最简单的消息循环
HINSTANCE hinst; HWND hwndMain; int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; BOOL bRet; WNDCLASS wc; UNREFERENCED_PARAMETER(lpszCmdLine); // Register the window class for the main window. if (!hPrevInstance) { wc.style = 0; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION); wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "MainMenu"; wc.lpszClassName = "MainWndClass"; if (!RegisterClass(&wc)) return FALSE; } hinst = hInstance; // save instance handle // Create the main window. hwndMain = CreateWindow("MainWndClass", "Sample", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, (HMENU) NULL, hinst, (LPVOID) NULL); // If the main window cannot be created, terminate // the application. if (!hwndMain) return FALSE; // Show the window and paint its contents. ShowWindow(hwndMain, nCmdShow); UpdateWindow(hwndMain); // Start the message loop. while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } // Return the exit code to the system. return msg.wParam; }