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

发布于:2025-03-17 ⋅ 阅读:(19) ⋅ 点赞:(0)

;运行效果

;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 

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