win32汇编环境,对 WM_MOUSEMOVE 消息的理解

ops/2025/3/13 5:23:50/

;运行效果

;win32汇编环境,对 WM_MOUSEMOVE 消息的理解
;理解在 WM_MOUSEMOVE 消息发生时,同时来的wParam和lParam值的含义,并取出各自的值进行运用。从这例子也可以更好的理解windows的消息机制.
;WM_MOUSEMOVE消息就是当鼠标移动时,发送给窗口的消息。如果窗口上面的其它控件,则经过控件上面的不起作用。因为其它控件不是主窗口
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include    windows.inc 
include    user32.inc 
include    kernel32.inc 

includelib user32.lib 
includelib kernel32.lib 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段
;Equ 等值定义

ICO_MAIN   equ 1000    ;图标 
IDSTATIC01 equ 21 
IDSTATIC02 equ 22
IDSTATIC03 equ 23
IDSTATIC04 equ 24
IDSTATIC05 equ 25
IDSTATIC06 equ 26
IDSTATIC07 equ 27
IDSTATIC08 equ 28

.data 
DlgName      db "MyDialog",0 

szCurrentXY  db "当前鼠标位置是:%d.%d",0
szMsg        db "提示",0
szCheshi     db "当前的十六进制值是:%lx",0

szMouseLN    db "鼠标左键状态:关闭",0
szMouseLY    db "鼠标左键状态:开启",0

szMouseRN    db "鼠标右键状态:关闭",0
szMouseRY    db "鼠标右键状态:开启",0

szSHIFTNO    db " SHIFT键状态:关闭",0
szSHIFTYES   db " SHIFT键状态:开启",0

szCtrlNO     db " Ctrl键状态:关闭",0
szCtrlYES    db " Ctrl键状态:开启",0

szMouseCN    db "鼠标中键状态:关闭",0
szMouseCY    db "鼠标中键状态:开启",0

szXBUTTON1N   db "XBUTTON1状态:关闭",0
szXBUTTON1Y   db "XBUTTON1状态:开启",0

szXBUTTON2N   db "XBUTTON1状态:关闭",0
szXBUTTON2Y   db "XBUTTON1状态:开启",0
.data? 
hInstance HINSTANCE             ? 
.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code 
start:     
        invoke GetModuleHandle, NULL     
        mov    hInstance,eax     
        invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL     
        invoke ExitProcess,eax 
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
        LOCAL @szBuffer[256]:byte 
        LOCAL @hX,@hY
       
        .if      uMsg == WM_INITDIALOG                 
                        invoke    LoadIcon,hInstance,ICO_MAIN           
                        invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax  

        .elseif uMsg == WM_MOUSEMOVE
                    
                    ;在 WM_MOUSEMOVE 消息发生时,同时来的wParam的值是32位的,其低16位的值是各种虚拟密钥的象征。
                    ;而同时来的lParam值里则是当前鼠标光标的X坐标和Y坐标。lParam是32位的,其低16位是X坐标值,而高16位则是Y坐标
                    ;比如你按下SHITE键时移动鼠标,其wParam的低16位会变成 00000100B
                    ;比如你按下Ctrl键时移动鼠标,其wParam的低16位会变成  00001000B  
                    ;比如你同时按下SHITE键和Ctrl键并移动鼠标,其wParam的低16位会变成  00001100B ,就是上面2个值的相加            
                    mov eax, wParam     ;判断鼠标左键是否关闭
                    and ax, 00000001B   ;按位逻辑与操作,即把ax的值的0位留下,就是从右向左数的第1位,就是这个1,其它位都置0先
                    .if ax ==      1B   
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC02,WM_SETTEXT,0,addr szMouseLY
                    .else
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC02,WM_SETTEXT,0,addr szMouseLN    
                    .endif
                    
                    mov eax, wParam     ;判断鼠标右键是否关闭  
                    and ax, 00000010B
                    .if ax ==     10B
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC03,WM_SETTEXT,0,addr szMouseRY
                    .else
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC03,WM_SETTEXT,0,addr szMouseRN    
                    .endif
                    
                    mov eax, wParam     ;判断SHITE键是否关闭  
                    and ax, 00000100B
                    .if ax ==    100B
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC04,WM_SETTEXT,0,addr szSHIFTYES
                    .else
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC04,WM_SETTEXT,0,addr szSHIFTNO    
                    .endif
                                        
                    mov eax, wParam     ;判断Ctrl键是否关闭  
                    and ax, 00001000B
                    .if ax ==   1000B
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC05,WM_SETTEXT,0,addr szCtrlYES
                    .else
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC05,WM_SETTEXT,0,addr szCtrlNO    
                    .endif
                    
                    mov eax, wParam     ;判断鼠标中键是否关闭  
                    and ax, 00010000B
                    .if ax ==  10000B
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC06,WM_SETTEXT,0,addr szMouseCY
                    .else
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC06,WM_SETTEXT,0,addr szMouseCN    
                    .endif
                    
                    mov eax, wParam     ;判断XBUTTON1键是否关闭,就是高级鼠标的左侧键,一般鼠标没有  
                    and ax, 00100000B
                    .if ax == 100000B
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC07,WM_SETTEXT,0,addr szXBUTTON1Y
                    .else
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC07,WM_SETTEXT,0,addr szXBUTTON1N    
                    .endif
                    
                    mov eax, wParam     ;判断XBUTTON2键是否关闭,就是高级鼠标的右侧键,一般鼠标没有  
                    and ax,  01000000B
                    .if ax == 1000000B
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC08,WM_SETTEXT,0,addr szXBUTTON2Y
                    .else
                        invoke  SendDlgItemMessage,hWnd,IDSTATIC08,WM_SETTEXT,0,addr szXBUTTON2N    
                    .endif
                    
                    ;以下开始取出lParam的低16位值和高16值,即鼠标的X坐标和Y坐标
                    mov eax, lParam
                    movzx eax,ax
                    mov @hX,eax
                    mov eax, lParam
                    shr eax,16
                    movzx eax,ax
                    mov @hY,eax
                    invoke  wsprintf,addr @szBuffer,addr szCurrentXY,@hX,@hY
                    invoke  SendDlgItemMessage,hWnd,IDSTATIC01,WM_SETTEXT,0,addr @szBuffer                                
        .elseif uMsg == WM_CLOSE                 
                        invoke EndDialog, hWnd,NULL         
        .else                
                mov eax,FALSE                 
                ret                 
        .endif                 
        mov eax,TRUE         
        ret 
DlgProc endp 

end start 

;下面为rc文件内容
#include "resource.h"              //提示缺少该文件,可以在资源里下载

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN    1000    //图标
#define IDSTATIC01  21 
#define IDSTATIC02  22 
#define IDSTATIC03  23
#define IDSTATIC04  24
#define IDSTATIC05  25
#define IDSTATIC06  26
#define IDSTATIC07  27
#define IDSTATIC08  28
 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    ICON        "Main.ico"

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//定义对话框
MyDialog DIALOG 10, 10, 160, 170 
STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 
CAPTION "对话框程序模版"
FONT 12, "方正姚体"
BEGIN
     CONTROL "可以按着CTRL或SHIFT键移动鼠标试试", -1, "Static", WS_CHILD | WS_VISIBLE, 10, 10, 200, 10
     CONTROL "当前鼠标位置:", IDSTATIC01, "Static", WS_CHILD | WS_VISIBLE, 30, 30, 100, 10 
     CONTROL "鼠标左键状态:", IDSTATIC02, "Static", WS_CHILD | WS_VISIBLE, 30, 50, 100, 10
     CONTROL "鼠标右键状态:", IDSTATIC03, "Static", WS_CHILD | WS_VISIBLE, 30, 65, 100, 10
     CONTROL "SHIFT键状态:", IDSTATIC04, "Static", WS_CHILD | WS_VISIBLE, 30, 80, 100, 10
     CONTROL "Ctrl键状态:", IDSTATIC05, "Static", WS_CHILD | WS_VISIBLE, 30, 95, 100, 10
     CONTROL "鼠标中键状态:", IDSTATIC06, "Static", WS_CHILD | WS_VISIBLE, 30, 110, 100, 10
     CONTROL "XBUTTON1状态:", IDSTATIC07, "Static", WS_CHILD | WS_VISIBLE, 30, 125, 100, 10
     CONTROL "XBUTTON2状态:", IDSTATIC08, "Static", WS_CHILD | WS_VISIBLE, 30, 140, 100, 10
END 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


http://www.ppmy.cn/ops/165336.html

相关文章

解决电脑问题(4)——主机问题

电脑主机出现问题的原因较为复杂,以下是一些常见问题及解决方法: 主机无法开机 检查电源连接:首先确保主机电源线插头牢固插入插座,且插座通电正常,可以尝试将其他电器设备插入该插座来验证。同时检查主机电源开关是否…

记录一下Django的密码重置(忘记密码)

一. Django默认的密码重置 1.路由 # url.pyfrom django.contrib.auth import views as auth_viewsurlpatterns [# 密码重置path(password_reset/, auth_views.PasswordResetView.as_view(), namepassword_reset),# 用户输入邮箱后,跳转到此页面path(password_res…

深入了解住宅IP:跨境电商中的重要工具

在全球化电商竞争白热化的今天,"账号无故被封"、"视频播放量归零"等问题如同达摩克利斯之剑悬在运营者头顶。这些看似无解的困境背后,往往隐藏着一个关键变量——IP质量。本文将深入剖析住宅IP这一数字时代的"身份通行证"…

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件(可能是配置的时候格式错误):/etc/docker/daemon.json(如果存在&#xf…

SpringMVC 6+ 依赖的 servlet 版本问题

在 Spring MVC 6.0.14 版本中,Spring 不再依赖 Java EE(Jakarta EE 8 及以下),而是完全迁移到 Jakarta EE 9,即所有 javax.servlet 相关包都被替换成了 jakarta.servlet 🔍 Spring MVC 6.0.14 依赖的 Servl…

Spring 面向切面编程 XML 配置实现

Spring 支持AOP &#xff0c;并且可以通过XML配置来实现。 <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:aop"http://www.springframework.org/schema/aop"xmlns:…

LINUX系统安装+添加共享目录

一、前言 Windows或mac系统中创建Linux工作环境是基于VMware和SL(Scientific Linux)&#xff0c;下面分别安装二者。 二、VMware软件安装及注册 1、双击VMware安装包 2、点击下一步 3、 勾选接受许可&#xff0c;并点击下一步 4、更改路径&#xff08;建议更改为容易找到的路…

蓝桥备赛(12)- 顺序表和 vector(下)

目录 一、动态顺序表 - vector 4.1 创造vector 4.2 size/empty 4.3 begin/end 4.4 push_back / pop_back 4.5 front / back 4.6 resize 4.7 clear 二、算法题 2.1 询问学号 2.2 寄包柜 2.3 移动零 2.4 颜色分类 2.5 合并两个有序数组 三 、拓展ACM模式 VS 核心代…