鼠标静止不动时候的消息

优化程序的时候发现鼠标放在控件上不动也会不停的收到WM_MOUSEMOVE消息。

1,

于是想了各种办法寻找是哪儿触发的。

bp USER32!PostMessageW ".echo PostMessageW_Breakpoint_hit; g"

bp USER32!SendMessageW ".echo SendMessageW_Breakpoint_hit; g"

*Message没有抓到WM_MOUSEMOVE消息,却触发了该消息。

0:035> x USER32!*PostMessage*

76483baa USER32!PostMessageA = <no type information>

764812a5 USER32!PostMessageW = <no type information>

764904e3 USER32!PackAndPostMessage = <no type information>

76481285 USER32!NtUserPostMessage = <no type information>

0:035> x USER32!*SendMessage*

7648781f USER32!SendMessageTimeoutA = <no type information>

764e0030 USER32!_imp__WinStationSendMessageW = <no type information>

764797d2 USER32!SendMessageTimeoutW = <no type information>

7647d611 USER32!SendMessageToUI = <no type information>

764838ee USER32!InSendMessageEx = <no type information>

764da9a8 USER32!WinStationSendMessageW = <no type information>

764d886b USER32!NtUserQuerySendMessage = <no type information>

764797fc USER32!SendMessageTimeoutWorker = <no type information>

*Message* 全部bp一遍也没有抓到。

2,

用vs2005创建一个WIN32程序,只在WndProc里面加上WM_MOUSEMOVE的打印:

鼠标不动依然受到了WM_MOUSEMOVE消息,

3,

原来鼠标在窗口上不动也会收到这几个消息:

#define WM_GETICON 0x007F
#define
WM_NCHITTEST 0x0084
#define
WM_SETCURSOR 0x0020
#define
WM_MOUSEMOVE 0x0200

-------------------------------------------------------------!

用spy++抓了一下,有的窗口能抓到有的不能抓到。

4,

看看MSDN怎么说

his message is posted to a window when user moves the mouse while pressing the left mouse button or moves the stylus while the tip is down. If another window does not capture the mouse stylus input, the OS posts the message to the window that contains the cursor or the stylus tip. If another window captures the mouse or stylus input, the OS posts the message to the window that has the capture.

Okay, so back to the original question, "Why do I get spurious WM_MOUSEMOVE messages?"

Notice that the delivery of a mouse message includes lots of work that is typically thought of as being part of mouse movement. Often, Windows wants to do that follow-on work even though the mouse hasn‘t actually moved. The most obvious example is when a window is shown, hidden or moved. When that happens, the mouse cursor may be over a window different from the window it was over previously (or in the case of a move, it may be over a different part of the same window). Windows needs to recalculate the mouse cursor (for example, the old window may have wanted an arrow but the new window wants a pointy finger), so it artificially sets the "The mouse moved, in case anybody cares" flag. This causes all the follow-on work to happen, a side-effect of which is the generation of a spurious WM_MOUSEMOVE message.

时间: 2024-10-15 06:17:14

鼠标静止不动时候的消息的相关文章

鼠标进入与离开的消息(使用CM_MOUSEENTER来判断是否进入控件)

unit Unit1; interface uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  StdCtrls; type  TForm1 = class(TForm)    Label1: TLabel;    Button1: TButton;    Edit1: TEdit;  private    { Private declarations }    procedure CM

鼠标消息与键盘消息

在Microsoft Windows 中,键盘和鼠标是两个标准的用户输入源,在一些交叠的操作中通常相互补充使用.当然,鼠标在今天的应用程序中比10年前使用得更为广泛.甚至在一些应用程序中,我们更习惯于使用鼠标,例如在游戏.画图程序.音乐程序,以及Web创览器等程序中就是这样.然而,我们可以不使用鼠标,但绝对不能从一般的PC中拆掉键盘. 相对于个人计算机的其他组件,键盘有非常久远的历史,它起源于1874年的第一台Remington打字机.早期的计算机程序员用键盘在 Hollerith卡片上打孔,以

界面控件 - 滚动条ScrollBar(对滚动条消息和鼠标消息结合讲的不错)

界面是人机交互的门户,对产品至关重要.在界面开发中只有想不到没有做不到的,有好的想法,当然要尝试着做出来.对滚动条的扩展,现在有很多类是的例子. VS2015的代码编辑是非常强大的,其中有一个功能可以把滚动态变成MinMap,可以通过Options->Text Editor->C/C++->Scroll Bars中的Behavior选项分类进行打开. sublime也有这个功能,但没有VS的好用.变成MinMap后整个代码文档变成一个完整的缩微图,在你对代码比较熟悉的情况下,可以非常容易

10.windows消息机制(五)

3.鼠标消息 (1)基本鼠标消息 WM_LBUTTONDOWN - 鼠标左键按下消息 WM_LBUTTONUP - 鼠标左键抬起消息 WM_RBUTTONDOWN - 鼠标右键按下消息 WM_RBUTTONUP - 鼠标右键抬起消息 WM_MOUSEMOVE - 鼠标移动消息 (2)双击消息 WM_LBUTTONDBCLK - 鼠标左键双击消息 WM_RBUTTONDBCLK - 鼠标右键双击消息 (3)滚轮消息 WM_MOUSEWHEEL - 鼠标滚轮消息

MFC中消息响应机制

由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的宏. (1)在消息响应函数的原型代码中,函数声明的前部有一个afx_msg限定符,也是一个宏,该宏表明这个函数是一个消息响应函数的声明. (2)消息映射宏:在视图类的源文件中,BEGIN_MESSAGE_MAP()和 END_MASSAGE_MAP()这两个宏之间定义了消息映射表,例如对于画线,其中

win 消息

Windows消息机制概述 消息是指什么?     消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.    消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息.例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标.这个

TControl与Windows消息

TControl将系统消息转换成VCL事件,以将系统消息融入VCL中.鼠标的事件就是一个很好的例子,当我们单击鼠标时会产生鼠标的单击消息,而这个单击消息是怎么被处理并执行的呢? 在Control单元中有这样的一段代码: 1 TControl = class(TComponent) 2 private 3 ... 4 FControlState: TControlState; //状态 //TControlState = set of (csLButtonDown, csClicked, ....

【转】windows常用消息大全(系统消息、通告消息、用户消息)

原文网址:http://blog.csdn.net/nupt123456789/article/details/7370562 附录A Windows 常用消息大全 表A-1  Windows消息分布 消息范围 说 明 0 - WM_USER – 1 系统消息 WM_USER - 0x7FFF 自定义窗口类整数消息 WM_APP - 0xBFFF 应用程序自定义消息 0xC000 - 0xFFFF 应用程序字符串消息 > 0xFFFF 为以后系统应用保留 表A-2  常用Windows消息 消息

深入探讨MFC消息循环和消息泵

首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC的应用程序中(应用程序类基于CWinThread继承),必须要有一个消息循环,他的作用是从应用程序的消息队列中读取消息,并把它派送出去(::DispatchMessage).而消息路由是指消息派送出去之后,系统(USER32.DLL)把消息投递到哪个窗口,以及以后消息在窗口之间的传递是怎样的.  消