一个关于Windows下SetCursorPos和GetCursorPos的小坑

这两天在做一个编辑特定格式Mesh的小工具,需要检查鼠标的移动,一般来说可以用WM_MOUSEMOVE事件解决的,但是我为了省事用了定时查询+设置的方式,也就是:

 1 void Frame(void)
 2 {
 3     //do something else...
 4
 5     POINT cursorPos;
 6     GetCursorPos(&cursorPos);
 7     curMoveX = cursorPos.x - cursorBaseX;
 8     curMoveY = cursorPos.y - cursorBaseY;
 9     cursorPos.x = cursorBaseX, cursorPos.y = cursorBaseY;
10     SetCursorPos(&cursorPos);
11
12     //do something else
13 }

很简单的逻辑,就是定期把Cursor设置到指定位置,然后过一会儿来检查Cursor跑到哪里了,看看这一段时间里Cursor移动了多少,不断重复这个过程就能得知鼠标怎么移动的(只是个小工具所以就这样实现了)。但是跑起来的时候遇到一个诡异的问题:在我没有移动鼠标的情况下,得到的Cursor位置变化量居然不是0(拔掉鼠标还是有这个现象,不是鼠标的问题),网上没有查到这个问题,我对Windows编程本来就不熟悉也不可能去仔细看文档(至少GetCursorPos和SetCursorPos的条目里没提这种现象),所以就搁下了。

后来想了想,问题可能出在我SetCursorPos的时候。于是我在Set过后立刻Get一次,然后比对Set和Get得到的值,然后发现有的时候这两个值竟然不一样(在未移动鼠标的情况下),差异也不大,但是足以干扰程序运行。知道了这一点,立刻就得出几种解决方法:一种是老老实实在窗口事件函数里用WM_MOUSEMOVE,相当于避开了这个问题;一种是当检测到的Cursor移动速度过慢的时候忽略这一移动,这样虽然能工作但不怎么漂亮;然后就是把Get和Set的量分开存储,每次Set之后立刻Get一次,下一次计算偏移量的时候就用这一次Get的值。最后我用了第三种方法,算是解决了问题。

问题本身不困难,但是算是个小坑,所以记录一下。关于导致问题的原因,我现在暂不清楚,以后学习的过程中会留意。初步猜测是在我SetCursorPos的时候系统并没有严格地把Cursor移动到我指定的位置,而是由于单位不同或者精度问题把Cursor设置到了离我指定的位置很近的另一个位置(比方说,偏移了一个像素),结果就是我没动鼠标,却发现Get和Set的值有时不一样了。

时间: 2024-11-08 22:22:07

一个关于Windows下SetCursorPos和GetCursorPos的小坑的相关文章

在CentOS/Windows下配置Nginx(以及踩坑)

在CentOS/Windows下配置Nginx(以及踩坑) 1. 序言 因为这类文章网上比较多,实际操作起来也大同小异,所以我并不会着重于详细配置方面,而是将我配置时踩的坑写出来. 2. CentOS 2.1 第一步下载nginx包 我选择将包放在/usr/local下 cd /usr/local wget (nginx下载目录网址) 这里的下载目录可以根据需要选择版本从而决定 请点击nginx下载查看目录 2.2 安装nginx所需环境 yum?install?gcc-c++ yum?inst

Windows下自动同步文件的小脚本

分享两个自己整理的在windows下自动定时同步文件的bat小脚本 (照猫画虎 o(∩_∩)o ) ******************************************************************* @echo off color 02 rem 使用goto和lftp来实现定时自动上传文件到ftp服务器指定目录         ##注释信息 :loop echo.   echo.   echo =================================

构思一个在windows下仿objc基于动画层ui编程的ui引擎

用c/c++编程有些年了,十个指头可以数齐,在涉入iOS objc开发后,有种无比舒服的感觉,尤其在UI开发上. 在QuartzCore.framework下动画和透明窗口等许多效果的事都变得那么方便和自然.因为在windows窗口机制中没有动画和透明窗口(Aero 除外)等效果的引擎层,还有GDI中不支持ARGB,开发中都要依靠不断重复而且大量的BitBlt和Timer来完成,工作量与开发iOS不可比. 大体上就是尝试引入UIKit.framework那样的编程体验.首先要有QuartzCor

windows下自动更改IP的小工具(bat批处理文件)

每次上线,都要先上灰度环境再上到正式环境.在上到灰度环境时,访问灰度环境通过自动获取IP和更改指定dns来实现.具体如何实现,大家可自行百度. 新建一个文本文档,将其后缀改为bat,打开该文件,拷贝一下代码: @echo off :start echo ============请输入数字选择下一步操作: echo ============1:ip设置为灰度 echo ============2:ip设置为原IP set /P var=":" if %var%==1 goto ip10

windows下python安装scrapy碰到的坑

1,提示没有找到vcvarsall.bat文件 确保安装了vs.我这边是win10系统,安装了vs2015,安装的时候要注意,自定义安装项,勾选上"编程语言"里面的库文件和python库支持 2,提示openssl的某个.h文件找不到 去openssl官网下载源码包,解压,把"openssl"整个目录扔到你的python安装目录的include里 3,提示lxml的某些文件找不到 http://www.lfd.uci.edu/~gohlke/pythonlibs/#

Linux下安装MySQL以及一些小坑

第一次写博客,各位凑合着看吧(假装有人看). 我这里使用的是centos7. 1.首先打开终端,查看有没有安装过MySQL: [[email protected] lyp]# rpm -qa | grep mysql 若为空则说明没有安装过,若要删除可用yum remove mysql命令. 2.下载mysql的repo源: [[email protected] lyp]# wget http://repo.mysql.com/mysql-community-release-el7-5.noar

如何在Windows下用cpu模式跑通py-faster-rcnn 的demo.py

关键字:Windows.cpu模式.Python.faster-rcnn.demo.py 声明:本篇blog暂时未经二次实践验证,主要以本人第一次配置过程的经验写成.计划在7月底回家去电脑城借台机子试试验证步骤的正确性,本blog将根据实际遇到的问题持续更新.另外blog中除提到的下载链接外我还会给出网盘链接方便下载,包括我的整个工程的网盘链接.如果有些报错解决不了可直接拿本人的相关文件替换,本篇blog具有较高的参考性. 本人微软版caffe工程     下载链接:http://pan.bai

windows下自制动画层引擎 - 放两个demo

一年前想写一个像cocoa那样,可以方便层动画开发的引擎,写着写着又逆向它的QuartzCore.framework,也就是CoreAnimation的底层,已经大半年没有搞windows这个引擎.大体来看,动画简单来说有9要素,矩形区域(x, y, w, h),仿射变换矩阵(translation, rotation, scale),还有就是透明度alpha,除此还必须有线性变化函数.这些在cocoa中构成了最基本的动画,也最常用,通常提交动画一个始态,一个终态,以及时间就OK了.有次序的动画

windows下编译erlang程序

erlang的编译方式有很多,这篇文章介绍一个在windows下简单好用的方法. 1.首先,在工程目录下面创建一个bat文件,内容为: "C:\Program Files (x86)\erl6.1\bin\erl.exe" -make 前面的目录是你的erlang安装目录: 2.然后,在工程目录下面创建一个Emakefile文件,Emakefile文件格式如下: { [ 'src/*', 'src/mod/*', 'src/pp/*', 'src/lib/*' ], [ debug_i