PeekMessage没有得到消息
PeekMessage not getting the message?
我创建了一个自定义消息类型,用于调整Window
的大小,称为WM_NEED_RESIZE
。我已经在.h文件中定义了它,并在.cpp文件中进行了初始化。我还注册了我的WindowProc
功能来接受消息。这是这些项目的代码:
const uint32 WindowsGLWindow::WM_NEED_RESIZE = WM_USER + 100;
LONG WINAPI WindowsGLWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static PAINTSTRUCT ps;// do I need this?
static sint32 newWidth = 0;
static sint32 newHeight = 0;
bool res = false;
switch (uMsg) {
case WM_PAINT:
//display();
BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
case WM_SIZE:
//glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
res = PostMessage(hWnd, WindowsGLWindow::WM_NEED_RESIZE, wParam, lParam);
std::cout << "WM_SIZE: " << res << std::endl;
return 0;
case WindowsGLWindow::WM_NEED_RESIZE:
std::cout << "WindowsGLWindow::WM_NEED_RESIZE" << std::endl;
break;
case WM_CHAR:
switch (wParam) {
case 27: /* ESC key */
PostQuitMessage(0);
break;
}
return 0;
case WM_CLOSE:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
在另一个函数中,我正在运行PeekMessage(..)
来收集所有消息。以下是消息泵的片段:
MSG msg;
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE) == TRUE) // maybe use GetInputState(?) as well?
{
if (msg.message == WM_QUIT)
retVal = -1;
if (msg.message == WindowsGLWindow::WM_NEED_RESIZE) {
uint32 newWidth = LOWORD(msg.lParam);
uint32 newHeight = HIWORD(msg.lParam);
std::cout << "PeekMessage: WindowsGLWindow::WM_NEED_RESIZE" << std::endl;
// call resize only if our window-size changed
if ((newWidth != width_) || (newHeight != height_)) {
resize(newWidth, newHeight);
}
PostMessage(msg.hwnd, WM_PAINT, 0, 0);
}
switch (msg.message) {
case WM_MOUSEMOVE:
// Retrieve mouse screen position
//int x = (short) LOWORD(lParam);
//int y = (short) HIWORD(lParam);
// Check to see if the left button is held down:
//bool leftButtonDown = wParam & MK_LBUTTON;
// Check if right button down:
//bool rightButtonDown = wParam & MK_RBUTTON;
break;
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_KEYUP:
case WM_KEYDOWN:
/*
switch (msg.wParam) {
case 'W':
// w key pressed
break;
case VK_RIGHT:
// Right arrow pressed
break;
default:
break;
}
*/
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
我的问题是,当窗口第一次打开时,WM_NEED_RESIZE
消息在消息队列中只找到一次,之后我的PeekMessage(..)
就再也找不到它了。我真的不知道为什么会发生这种事。然而,它是,由WindowProc(..)
方法接收(这对我没有真正的帮助)。如果你们能提供任何帮助,我将不胜感激。
感谢
Jarrett
-
不要使用std::cout期望在调试器中看到该输出,而应该使用OutputDebugString()。
-
您需要将类指针传递到调用CreateWindowEx的最后一个参数,然后从WM_CREATE的LPARAM中传递给您的LPCREATESTRUCT中检索该指针,您的类指针将位于结构的lpCreateParmas字段中。将类指针设置为窗口的GWLP_USERDATA,在任何其他消息调用中,调用GetWindowsLong,检索类指针,然后将消息、wparam和lparam全部传递给内部类消息处理程序。
http://msdn.microsoft.com/en-us/library/ff381400%28v=VS.85%29.aspx
一旦队列为空,您显示的消息泵循环就会退出。我无法从你发布的内容中判断它是否再次被输入。
如果这是你的主要消息泵,你应该使用GetMessage(),因为它会等到有东西可用后再返回。查看MSDN的这篇文章以了解更多信息。
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 重新定义预定义的 errno 错误消息 (E2BIG)
- GetMessage/PeekMessage - 删除消息队列中的所有消息
- PeekMessage没有得到消息