SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP

今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 WM_LBUTTONDOWN(按下) 和 WM_MOUSEMOVE(移动),没了 WM_LBUTTONUP(松开)

百度了一下,找到解决方案:https://bbs.csdn.net/topics/390386415

网友@信阳毛尖:

一般在 WM_LBUTTONDOWN 消息的处理函数中设置焦点为当前窗口 SetCapture(m_hWnd)
然后再 WM_LBUTTONUP 消息的处理函数中释放焦点 ReleaseCapture()

按照提示,在 case WM_LBUTTONDOWN: { SetCapture() ...},  在 case WM_LBUTTONUP: { ReleaseCapture() ... }, 就可以解决当鼠标移动到窗口外也能捕获到 WM_LBUTTONUP。

但是测试的时候发现一个问题, 在 case WM_MOUSEMOVE 中,如果鼠标移到窗口的外的左上角,获取到的坐标 x, y 不对了, 返回值 6xxxx+

接着继续百度吧,又找到这一篇: https://blog.csdn.net/lanbing598235681/article/details/8136337

注意 x y 都是一个LONG 所以它们认为左数第1位是符号位 其他都表示数值
而 LOWORD HIWORD 得到的32位数 前16位都是0
所以 x y 一直会是正数 不会出现负数 (已经和鼠标在窗口上方和右方矛盾) 而且当lParam 是表示负坐标时 x y会是很大的整数 6xxxx (所以会画到很下面很右面去)

原来读取鼠标坐标 x,y 的写法是:

int x = (int)LOWORD(lParam);//取低位
int y = (int)HIWORD(lParam);//取高位

解决办法:需要将 (int) 改成 (short)

int x = (short)LOWORD(lParam);//取低位
int y = (short)HIWORD(lParam);//取高位

这样就可以获取到正确的 x,y 坐标了。

原文地址:https://www.cnblogs.com/personnel/p/9314173.html

时间: 2024-10-09 04:43:16

SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP的相关文章

SetCapture ReleaseCapture

函数功能:该函数在属于当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内.同一时刻只能有一个窗口捕获鼠标.如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口. 目录 1作用及参数 2鼠标事件 1作用及参数编辑 函数原型:HWND SetCapture(HWND hwnd): 参数: hWnd:当前线程里要捕获鼠标的窗口句柄. 返回值:返回值是上次捕获鼠标的窗口句柄.如果不存在那样的句柄,返回值是NULL.

没有躲过的坑--捕获窗口之外的鼠标消息(钩子还是??)

做一个发送表情的对话框,类似微信和QQ一样的,点击表情按钮,弹出表情框,鼠标点击表情框外时,这个表情框被kill. 说白了 就是在这个窗口上获得窗口外面的鼠标消息. Google百度了一番,很多人说道使用钩子,才能获得窗口外面的click事件,这也未免太小题大做了吧. 还好发现了一个简简单单的函数: SetCapture(*this); 函数功能:该函数在属于当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内.同一时刻只能有一个窗口捕获鼠标

iOS 捕获系统外异常

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 有时应用崩溃,而日志中的输出信息太少,无法定位问题,这是最头疼的事情,尤其很累的时侯,已经想不起来刚才改过什么了,这就叫做无耐. 工欲善其事,必先

【转】SQL内连、外连(左连、左外连)、交叉连接的简单理解

源自:http://www.cnblogs.com/kevinGaoblog/archive/2012/07/05/2577410.html --查询分析器中执行:--建表table1,table2:create table table1(id int,name varchar(10))create table table2(id int,score int)insert into table1 select 1,'lee'insert into table1 select 2,'zhang'i

左键拖动窗口

思路 1)拦截 WM_NCHITTEST 2)判断可拖动区域 3)return HTCAPTION; 引申 可以拦截WM_NCHITTEST消息之后的  WM_NCLBUTTONDOWN 消息,进行进一步控制. 但注意 WM_NCLBUTTONUP无法拦截到,除非用HOOK左键拖动窗口,码迷,mamicode.com

内连接,外链接(左连接、右连接、全连接),交叉连接大总结+附SQL JOINS图解[转]

1.什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 2.分类: 首先划分一下,连接分为三种:内连接.外连接.交叉连接 内连接(INNER JOIN): 分为三种:等值连接.自然连接.不等连接 外连接(OUTER JOIN): 分为三种:      左外连接(LEFT OUTER JOIN或LEFT JOIN)      右外连接(RIGHT OUTER JOIN或RIGHT JOIN)      全外连接(FULL OUTER JOI

mysql之内连接,外连接(左连接,右连接),union,union all的区别

内连接,外连接,左连接,右连接,全连接 测试数据: CREATE TABLE `a_table` ( `a_id` int(11) DEFAULT NULL, `a_name` varchar(10) DEFAULT NULL, `a_part` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into a_table values(1,"老潘","总裁部"),(2,&quo

wind10开始菜单左键点击失效,右键正常

今儿上班和往常一样开机-"登录QQ"--"打开菜单"--"远程桌面连接"-*** 呀,开始菜单右键点击正常,左键点击失效了嘛,怀疑可能是昨天下班系统更新捣鬼了呗 (系统正版win10,排除盗版插件问题,且本人运气好这辈子除了服务器受到过大神的光顾过外,本地电脑貌似还没受过到各位大神的青睐,且报警系统未作为,暂且勿用质疑) 步骤: 控制面板>>>>>程序>>>>>>>程序和功能

iOS开发>学无止境 - 只会左键断点?是时候试试这样那样断点了

作者:空之境界 网址:http://supermao.cn/duan-dian-shen-ru-liao-jie/ 点击“阅读原文”可查看本文网页版 编码不能没调试,调试不能没断点(Break Point).XCode的断点功能也是越来越强大. 基本断点 如下图,这种是最常用的断点,也是最容易设置.左键点击一下就可以设置. 编辑断点 断点是可以编辑的. 断点有下面几个属性可以设置: Condition Ignore Action Options Condition 这里可以输入条件表达式,满足条