当窗口未最大化时缺少 WM_NCLBUTTONUP 消息的奇怪问题

2024-04-11

我有一个处理 WM_NCLBUTTONUP 消息的窗口,以便处理标题栏中自定义按钮的点击。当窗口最大化时,这非常有效,但当窗口未最大化时,WM_NCLBUTTONUP 消息永远不会到达!不过我确实收到了 WM_NCLBUTTONDOWN 消息。奇怪的是,如果我单击菜单栏的右侧,WM_NCLBUTTONUP 确实会到达,但沿着标题栏/窗口框架的任何位置,消息永远不会到达。

经过一段时间的调试,我发现如果我在 CMainFrame::OnNcLButtonDown() 上设置断点,单击标题栏,但按住鼠标按钮,让调试器在函数中中断,按 F5 继续调试,然后释放鼠标按钮 - 神奇地发送了 WM_NCLBUTTONUP!

我的问题有两个:(1)到底发生了什么? (2)我如何解决这个“问题”。

我还注意到互联网上还有其他几个人也有同样的问题(快速谷歌显示很多其他人也有同样的问题,但没有解决方案)。

Edit
感谢前两个回复,我尝试在NCLButtonDown中调用ReleaseCapture,但没有效果(实际上,它返回NULL,表明捕获不到位)。我只能假设基类(def window proc)功能可以设置捕获。我周一去调查一下...


我也遇到过同样的问题。问题确实是,左键单击窗口标题会开始拖动,从而导致鼠标捕获,从而阻止 WM_NCLBUTTONUP 到达。

解决方案是重写 WM_NCHITTEST:

LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
    switch (nMsg)
    {
        ...
        case WM_NCHITTEST:
            Point p(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam);
            ScreenToClient(p);
            if (myButtonRect.Contains(p))
            {
                return HTBORDER;
            }
            break;
    }
    return DefWindowProc(hWnd, nMsg, wParam, lParam);
}

因此,本质上,您通知 Windows 您的按钮占用的区域不是窗口标题的一部分,而是非客户区域 (HTBORDER) 的非特定部分。

脚注:如果您在期望 WM_NCLBUTTONDOWN 消息传入时调用了 SetCapture() 但尚未调用 ReleaseCapture(),则即使进行了上述更改,该消息也不会到达。这可能会令人恼火,因为在与此类自定义按钮交互期间捕获鼠标是正常的,这样如果鼠标离开窗口,您就可以取消单击/突出显示。但是,作为使用捕获的替代方法,您可以考虑使用短间隔(例如 100 毫秒)的 SetTimer()/KillTimer(),这不会导致 WM_NCLBUTTONUP 消息消失。

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

当窗口未最大化时缺少 WM_NCLBUTTONUP 消息的奇怪问题 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 通过win32检测多个登录用户

    使用标准 win32 api 检测多个用户登录的最佳方法是什么 我对我们的软件产品进行了升级 当多个用户登录时 该产品无法运行 我知道这是应该避免的事情 因为它很烦人 但该产品非常复杂 您必须相信我 当我说确实没有其他解决方案时 谢谢 为了
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • Microsoft Azure Graph API下载项附件内容

    当我在office365网页浏览器页面中打开电子邮件时 有一个选项可以下载该电子邮件的附件内容项目附件 使用 Microsoft Outlook 将另一封邮件附加到当前邮件 eml 文件 内容类型 RFC 822 但是 当我尝试通过 Gra
  • 监控 Spring Embedded Tomcat 指标

    我想监控 Spring Boot 服务中嵌入的 Tomcat Spring 本身为我提供了一些会话使用统计信息 但我需要有关底层线程池的其他信息 如活动连接 队列长度等 我搜索了注册的bean 但找不到使用的线程池 关于如何检索该信息有什么
  • PHP:如何检查一年中的季节并相应地设置类别

    我有一个网站 它在标题区域使用 4 种不同的背景图像 这些图像在视觉上对应于耳朵的季节 夏季 秋季等 对于夏季时间框架 我使用一张图像 对于秋季时间框架 使用另一张图像 依此类推 问题是 一旦一年中的季节发生变化 我就必须手动更改这些图像
  • 使用office.js进行office加载项开发时,无法在word文档的书签中插入文本

    我正在开发一个 word 插件 主要任务是使用数据库中的数据填充文档中的书签 在 office js 中 我发现书签可以作为范围对象进行访问 并且我正在使用 rangeObject insertText text insertLocatio
  • wpf c# 按钮等待按钮按下

    好吧 我是编码初学者 所以我想做的是按钮谁会等待用户单击多个其他按钮之一以继续 void Mainbutton the program run throw so method Wait for the user to choose one
  • 了解 htaccess 文件匹配代码

    我正在尝试将 drupal 安装在我的 bluehost 托管网站的子目录中 这是一个巨大的痛苦 我认为 htaccess 中的以下几行是问题所在 当我当前导航到 mysite com subdir install php 时 出现 403
  • SML 中的 'a 和 ''a 有什么区别?

    例如 fun example a a list list a 将有以下签名 a list gt a list 如果我定义不同但内容相同怎么办 例如 fun example a a list list a 它的签名是 a list gt a
  • Android 手持设备和穿戴设备收不到消息

    我正在尝试从可穿戴设备向手持设备发送消息 然后从手持设备向可穿戴设备发送响应 两个模块都使用相同的代码和逻辑 Gradle compile com google android support wearable 2 0 0 alpha2 c
  • 图像数据类型 SQL Server 2008 C# 数据类型

    我创建了一个数据表 CREATE TABLE ProductImages ProductImageID int IDENTITY 1 1 NOT NULL ProductImage image NOT NULL CONSTRAINT PK
  • 设置属性“system.windows.resourcedictionary.deferrablecontent”引发异常

    我正在运行 Visual Studio 2012 当我向项目添加新文件 引用时 会出现消息框并显示错误消息 设置属性 system windows resourcedictionary deferrablecontent 引发异常 我读了一
  • Linux:如何对系统内存施加负载?

    我正在开发一个小功能 它可以让我的用户了解 CPU 的占用情况 我在用着cat proc loadavg 它返回众所周知的 3 个数字 我的问题是 当我正在开发时 CPU 目前没有做任何事情 有没有一种好方法可以在CPU上产生一些负载 我在
  • iOS 不使用[电子邮件受保护]

    我有 3 张图片 test png email protected cdn cgi l email protection email protected cdn cgi l email protection 在IBOutlet中 设置一个U
  • 如何绘制高分辨率图表

    我使用 matplotlib 绘制了一些实验结果 在这里讨论过 循环文件并绘图 https stackoverflow com questions 39676294 looping over files and plotting pytho
  • 计算非凸多面体的外向法线

    如果多面体的所有节点 可能是非凸的 及其坐标已知 面的点按顺序给出 绕外法线逆时针或顺时针 如何获得每个面的外法向量脸 这是凸多面体的一种方法 计算面法线和缠绕 https stackoverflow com questions 40454
  • 使用 Angular CLI 命令安装 Bootstrap 时如何解决依赖冲突?

    我尝试使用 CLI 命令在我的 Angular 应用程序中安装 Bootstrap ng 添加 ng bootstrap ng bootstrap 但我得到了以下错误回报 使用 Angular CLI 命令安装 Bootstrap 时如何解
  • NHibernate 中的延迟加载

    如果客户有很多订单 如何使用 NHibernate 延迟加载订单列表 是不是需要设置映射文件 任何帮助或例子都会很棒 克里斯的建议是我如何做到这一点 但是如果您想在运行时执行此操作 您可以根据您的标准将 Fetchmode 设置为惰性 如下
  • 忽略忽略属性

    我们有 MSTest 测试 它会在每小时的生产中自动运行 其中一项测试标有 Ignore 属性 因为它还没有准备好在我们的生产环境中运行它 现在我想 仅 在我的本地环境上启动该测试 因为我的本地环境已准备好进行该测试 我尝试通过单击测试代码
  • 将 select 的背景颜色设置为 JQuery 中选定的选项

    这个问题的后续 在 JQuery 中设置选择选项的背景颜色 https stackoverflow com questions 5065167 setting background color of select options in jq
  • FluentMigrator 失败的迁移不回滚?

    我刚刚开始尝试流利迁移器 http github com enkari fluentmigrator readme 我注意到失败的迁移不会被回滚 这还没有实施吗 这看起来相当糟糕 因为它使数据库处于损坏状态 例如 当第二次尝试添加 Tabl
  • 当窗口未最大化时缺少 WM_NCLBUTTONUP 消息的奇怪问题

    我有一个处理 WM NCLBUTTONUP 消息的窗口 以便处理标题栏中自定义按钮的点击 当窗口最大化时 这非常有效 但当窗口未最大化时 WM NCLBUTTONUP 消息永远不会到达 不过我确实收到了 WM NCLBUTTONDOWN 消