• 忘掉天地
  • 仿佛也想不起自己
  • 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2024-08-18 17:40 Aet 隐藏边栏 |   抢沙发  9 
文章评分 2 次,平均分 5.0

spy++相关

使用

  1. 打开spy++

  1. 查找窗口

  1. 把小圆圈拖动到目标窗口上,比如按钮等等
    1. 并且在下面选择消息

  1. 在消息窗口查看日志
    1. 具体信息看下发示例

示例行为

  1. 使用spy++监听了某个窗口上的一个Button的消息
  2. 然后移动鼠标到Button
  3. 然后用鼠标左键点击该Button

日志

数据

格式

  1. S:
    1. 发送 (Send) 消息
    2. 这表示消息正在被发送到窗口处理程序
  2. R:
    1. 返回 (Return) 消息
    2. 这表示窗口处理程序已经处理完消息并返回
  3. P:
    1. 处理 (Process) 消息
    2. 表示窗口处理程序正在处理消息

日志分析

鼠标移动到Button

  1. Windows系统的行为
    1. 当你将鼠标移动到按钮上时,Windows 系统会发送 WM_MOUSEMOVE 消息给按钮窗口(即 hwnd:0003120A
      通知它鼠标已经进入了它的客户区(HTCLIENT 表示鼠标在客户区内)
    2. 随后,系统发送 WM_SETCURSOR 消息,这个消息是为了设置或更新鼠标光标的外观
      按钮窗口收到 WM_SETCURSOR 消息后,通常会根据当前的光标位置和状态设置适当的光标样式
      比如在 HTCLIENT 区域,通常会显示箭头光标
  2. spy++的行为
    1. Spy++ 捕捉到了多次发送的 WM_SETCURSOR 消息,每次鼠标在按钮上移动时,系统都会发送此消息,并显示在 Spy++ 的日志中
    2. Spy++ 还显示了每条消息的相关参数,比如窗口句柄(hwnd:0003120A)、鼠标位置、光标状态等
    3. 日志中显示 fHaltProcessing:False,表示这些 WM_SETCURSOR 消息没有被中断处理,系统正常处理并返回

鼠标右键点击按钮时

  1. Windows系统的行为
    1. 按下鼠标右键时,系统首先发送 WM_MOUSEACTIVATE 消息,这条消息用于决定当前窗口是否应该接收鼠标事件并激活
    2. 如果 MA_ACTIVATE 被设置(如日志中所示),窗口会变为激活状态并继续接收鼠标事件
    3. 在接收到鼠标按下事件 (WM_LBUTTONDOWN) 时,系统再次发送 WM_SETCURSOR 消息。这是为了确保在按下鼠标按钮时,光标状态是正确的
    4. 系统分别发送 WM_LBUTTONDOWNWM_LBUTTONUP 消息,表示鼠标左键在按钮上的按下和释放操作
      日志中显示了点击的具体位置 (xPos:17 yPos:13),这是鼠标点击事件的发生位置
    5. 当鼠标离开按钮窗口时,系统发送 WM_MOUSELEAVE 消息,通知窗口鼠标已经离开其客户区
      这通常用于处理鼠标移出控件后的状态变化,比如取消高亮或隐藏悬停效果
  2. spy++的行为
    1. Spy++ 捕捉并显示了这些与鼠标点击相关的消息,包括 WM_MOUSEACTIVATEWM_LBUTTONDOWNWM_LBUTTONUPWM_MOUSELEAVE
      这些消息依次记录了鼠标点击操作的全过程
    2. 消息处理状态显示为 P(Process),表明这些消息已经被正常处理,并且鼠标点击事件已经在按钮上发生

具体分析

  1. 示例1
    1. Windows 系统向句柄为 0003120A 的窗口发送了 WM_SETCURSOR 消息
    2. nHittest 表示光标当前所处的窗口区域的命中测试值(Hit Test value
    3. HTCLIENT 意味着光标处于窗口的客户区(Client Area),也就是窗口内容的显示区域,不包括边框、标题栏等非客户区部分
    4. WMouseMsg 表示引发 WM_SETCURSOR 消息的原始鼠标消息
      这个例子中,WM_MOUSEMOVE 是引发 WM_SETCURSOR 的原因
      这意味着,当鼠标移动时,系统检测到光标位置变化,于是发送了 WM_MOUSEMOVE 消息,进而导致 WM_SETCURSOR 消息的发送

  1. 示例2
    1. 表示 WM_SETCURSOR 消息已经被 Windows 系统处理完毕并返回结果
    2. 000030: 这是 Spy++ 记录的消息序列号,用于标识这条消息在整个消息队列中的顺序
    3. 0003120A: 这是处理该消息的窗口句柄
    4. R: 表示 Return,即消息处理结束,并返回控制权给消息发送者
      这表明窗口已经处理了 WM_SETCURSOR 消息,并且消息处理函数已经返回
    5. WM_SETCURSOR: 这是被处理的消息类型
    6. fHaltProcessing:False:
      这个字段表明在处理 WM_SETCURSOR 消息的过程中,是否有任何需要中断或停止后续处理的情况发生
      fHaltProcessing:False 表示消息处理过程中没有任何需要中止或阻止进一步处理的情况,处理正常完成
      换句话说,这意味着处理程序并没有做出任何特殊的处理来阻止其他默认行为的继续执行

  1. 示例3
    1. 表示 Windows 系统向句柄为 0003120A 的窗口发送了 WM_LBUTTONDOWN 消息
    2. fWKEYS:MK_LBUTTON:
      fWKEYS 表示按键状态标志 (key state flags)
      这个字段显示了在 WM_LBUTTONDOWN 事件发生时,哪些修饰键或鼠标按钮处于激活状态
    3. MK_LBUTTON 表示鼠标左键 (Left Mouse Button) 处于按下状态。这也是导致 WM_LBUTTONDOWN 消息发送的直接原因
    4. xPoS:17 yPos:13
      xPoS:17 表示鼠标在窗口客户区的 x 坐标为 17 像素
      yPos:13 表示鼠标在窗口客户区的 y 坐标为 13 像素
    5. 坐标是相对于窗口客户区的原点(左上角)而言的

  1. 示例4
    1. 0000 表示没有任何修饰键或鼠标按钮处于按下状态
    2. 这意味着当鼠标左键被释放时,没有其他按键(如 ShiftCtrlAlt 等)或鼠标按钮(如右键、中键等)同时处于按下状态

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2024-09-03
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享