PeekMessage 收不到消息?

2024-02-16

我创建了一个自定义消息类型,用于调整我的大小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只找到消息once当窗口第一次打开时在消息队列中,之后我再也没有在消息队列中找到它PeekMessage(..)。我真的不知道为什么会发生这种情况。它is,然而,被接收WindowProc(..)方法(这对我没有太大帮助)。我将不胜感激你们能提供的任何帮助。

Thanks

Jarrett


  1. 不要使用 std::cout 期望在调试器中看到该输出,而是使用 OutputDebugString(); 。

  2. 您需要将类指针传递给 CreateWindowEx 调用的最后一个参数,然后从 WM_CREATE 的 LPARAM 中传递给您的 LPCREATESTRUCT 中检索该指针,您的类指针将位于该结构的 lpCreateParmas 字段中。将您的 class 指针设置为窗口的 GWLP_USERDATA ,并在任何其他消息调用中,调用 GetWindowsLong ,检索您的类指针,然后将消息、wparam 和 lparam 全部传递给您的内部类消息处理程序。

http://msdn.microsoft.com/en-us/library/ff381400%28v=VS.85%29.aspx http://msdn.microsoft.com/en-us/library/ff381400%28v=VS.85%29.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PeekMessage 收不到消息? 的相关文章

随机推荐

  • 如何从 Core Data 的持久存储中删除所有对象?

    我的应用程序中有核心数据 因此 我获取一个 XML 文件 将数据解析为模型对象并将它们插入到核心数据中 它们保存在持久存储中 当我重新启动应用程序时可以访问它们 但是 我希望能够随意刷新持久存储中的数据 因此我需要首先从存储中删除现有对象
  • 如何使用 client_credentials 从资源服务器访问另一个 oauth2 资源?

    我想使用 client credentials 从反应性资源服务器访问另一个受 oauth2 保护的资源 我使用颁发的令牌访问资源服务器的部分正在工作 但没有使用 webclient 调用其他资源 使用 UnAuthenticatedSer
  • 如何在 Eiffel 中格式化 DOUBLE 以仅打印两位小数?

    在埃菲尔铁塔中 你如何做到这一点 118 1999999999999 打印到 118 20 在其他语言中 这只是 printf 的问题 但在 Eiffel 中似乎没有办法轻松做到这一点 您应该使用类 FORMAT DOUBLE local
  • 对不同的 Android 应用程序使用一个 Google 地图 API 密钥

    我刚刚生成了要在我的 Android 应用程序中使用的 Google 地图 API 密钥 我必须提供应用程序的 SHA 1 指纹和包名称 它看起来像这样 BB 0D AC 74 D3 21 E1 43 67 71 9B 62 91 AF A
  • 计算两个日期之间的星期几小时对

    考虑以下列表星期几小时配对24H format Mon 9 23 Thu 12 13 14 Tue 11 12 14 Wed 11 12 13 14 Fri 13 Sat Sun 和两个时间点 例如 Start datetime datet
  • ffmpeg 给出错误选项 movflags not find

    在 Ubuntu 12 04 LTS 中我使用过 movflags frag keyframe empty moov在我的 ffmpeg 命令中 ffmpeg i http filesbe vocativ internal net 03 4
  • 处理 appwidget 的多个实例

    我有一个配置活动 一个大型小部件提供程序和一个小型小部件提供程序 在配置活动中 我在共享首选项中保存了一些值 我从大大小小的应用程序小部件提供商那里获得了这些共享的偏好 我无法为应用程序小部件提供唯一的 ID 并且每次从配置活动转到应用程序
  • D7 需要苹果风格的“等待”动画

    有谁知道与 Delphi 7 一起使用的 Apple 风格 等待 动画 VCL 组件吗 谢谢 不知道当前的 Apple 外观如何 但这里有一个免费的在线服务来创建 Ajax 加载 gif 文件 http www ajaxload info
  • Spark 构建路径与不兼容的 Scala 版本 (2.10.0) 交叉编译

    当我尝试在 scala IDE 中执行 Spark sql 代码时 出现以下错误 有人可以帮我解决这个问题吗 spark build path is cross compiled with an incompatible version o
  • 在 AngularJS 中只注册一次事件监听器

    我正在将一个事件从我的导航栏控制器广播到另一个控制器 但是如果我多次初始化控制器 当我在应用程序中前后移动时 则在我的控制器上执行的函数 on事件运行多次 因为它已注册多次 rootScope on submitBookingDialog
  • 如何指定DbContext要使用的表的名称

    这是来自的后续问题我之前的问题 https stackoverflow com questions 26404786 dbcontext doesnt give any data 我的印象是 如果数据库中有多个表 则该表的名称DbSet变量
  • 我在哪里可以找到将任意布尔表达式转换为合取或析取范式的方法?

    我写过一个小应用程序 https bitbucket org BillyONeal pevfind overview将表达式解析为抽象语法树 现在 我对表达式使用一系列启发式方法来决定如何最好地评估查询 不幸的是 有些例子使查询计划变得非常
  • Mongoose 不会从 JSON 数组创建子文档

    我正在尝试将包含第一级数据和数组的 JSON 对象写入 MongoDB 相反 发生的情况是所有第一级数据都被存储 但数组中包含的任何内容都没有存储 当记录服务器接收到的数据时 我看到了整个对象 这让我相信我的 Mongoose 代码有问题
  • 获取裸存储库的工作副本

    我有一台服务器 上面有一个用于推送的裸存储库 但是 我的服务器需要有主分支的工作副本 如何仅从裸存储库获取工作副本 您可以简单地将存储库克隆到同一台计算机上的另一个目录 git clone bare repo dir 当前目录将成为您的存储
  • 如何识别哪个容器拥有哪个覆盖目录?

    My var lib docker overlay目录包含我的容器的数据 但目录名称均经过哈希处理 如何确定哪个容器拥有哪个覆盖层 您可以使用jq像这样 docker inspect docker ps qa jq r map Name G
  • BinaryFormatter 中的引用完整性

    Protobuf net 中 AsReference 选项的存在以及 BinaryFormatter 是 图形序列化器 这个词让我假设 BinaryFormatter 不维护引用 并且它会复制每个对象 但我做了一些测试 发现单个 Binar
  • 从 VB.NET 中的 List(Of T) 中删除重复项

    我无法从列表中删除重复项 我究竟做错了什么 Dim Contacts As New List Of Person remove duplicates Contacts Contacts Distinct New PersonEquality
  • 可靠集合缓存作为 Service Fabric 中的缓存

    我的系统使用一堆微服务来处理一个项目 我计划创建一个有状态微服务来保存该项目的最新状态 在该服务中 我计划将所有项目状态存储在可靠的字典中 并且每当访问项目时都会更新该项目的 上次访问 字段 我的要求是 我只想将最近使用的项目存储在可靠的集
  • bc 及其 ibase/obase 选项:

    我偶然发现了一个奇怪的错误 我想 我尝试将 512 读取为基数 6 的数字 并将其输出为基数 16 echo ibase 6 obase 16 512 bc 161 正如你所看到的 输出是161 但它应该是bc 原文如此 我尝试使用基数 1
  • PeekMessage 收不到消息?

    我创建了一个自定义消息类型 用于调整我的大小Window 称为WM NEED RESIZE 我已在 h 文件中定义它 并在 cpp 文件中初始化 我也注册了我的WindowProc接受消息的功能 以下是这些项目的代码 const uint3