当前位置: 首页 > news >正文

汇编语言学习笔记-接收鼠标消息

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
. 386
.model flat,stdcall;内存平坦,参数传递约定
option casemap:none;大小写敏感

;;;;;;引用一些必要的数据
include D:\masm32\include\windows.inc
include D:\masm32\include\user32.inc
include \masm32\include\gdi32.inc
includelib D:\masm32\lib\user32.lib
include D:\masm32\include\kernel32.inc
includelib D:\masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD;函数声明,将在后面进行函数的定义

RGB macro red,green,blue;宏定义
xor eax,eax;eax置零
mov ah,blue
shl eax,
8 ;左移8位
mov ah,green
mov al,red
endm

;;;;;;已定义数据的数据段
.DATA
ClassName db
" SimpleWinClass " , 0
AppName db
" Our First Window " , 0
OurText db
" hello world " , 0
FontName db
" script " , 0
char WPARAM 20h
MouseClick db
0 ;0就是没有点击

;;;;;;未定义数据的数据段
.DATA
?
hInstance HINSTANCE
?
CommandLine LPSTR
?
hitpoint POINT
<> ;位置结构

;;;;;;代码段
.CODE
start: ;程序的入口与end start对应
invoke GetModuleHandle,NULL;调用API函数获取应用程序句柄并把句柄存入eax寄存器
mov hInstance,eax
invoke GetCommandLine;获取命令行的字符串指针
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT;调用子函数,也就是前面我们定义的函数
invoke ExitProcess,eax;退出程序

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD;子函数的定义,包括函数名称,参数类型,参数名称
;子程序的开始必须先定义该子程序用到的变量
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
;初始化窗口类,这个窗口类描述我们的窗口长的什么样子
mov wc.cbSize,SIZEOF WNDCLASSEX;窗口类结构将占用多少个字节
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW
+ 1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION;获取一个系统图标
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW;获取一个系统光标
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc;注册窗体
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL;创建窗体
mov hwnd,eax;保存窗口句柄
invoke ShowWindow,hwnd,CmdShow;显示窗口
invoke UpdateWindow,hwnd;刷新窗口

;开始消息循环
.WHILE TRUE
invoke GetMessage,ADDR msg,NULL,
0 , 0 ;获取消息队列中的消息
.BREAK .IF (
! eax);如果获取的消息为WM_QUIT就退出消息循环
invoke TranslateMessage,ADDR msg;按键消息的转义
invoke DispatchMessage,ADDR msg;把消息发送到负责消息处理的函数,回调方法
.ENDW
mov eax,msg.wParam;把退出的消息代码码放到EAX里然后回到主函数
ret
WinMain endp

WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM;消息处理函数,此函数可以随便命名
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
LOCAL hfont:HFONT
.IF uMsg
== WM_DESTROY;销毁窗口的消息
invoke PostQuitMessage,NULL
.ELSEIF uMsg
== WM_CHAR
push wParam
pop
char
invoke InvalidateRect,hWnd,NULL,TRUE;使客户区无效,后系统会发出WM_PAINT消息
.ELSEIF uMsg
== WM_PAINT
invoke BeginPaint,hWnd,ADDR ps
mov hdc,eax
.IF MouseClick
invoke lstrlen,ADDR OurText;获取字符串长度,保存在eax
invoke TextOut,hdc,hitpoint.x,hitpoint.y,ADDR OurText,eax
.ENDIF
invoke EndPaint,hWnd,ADDR ps;释放环境句柄
.ELSEIF uMsg
== WM_LBUTTONDOWN
mov eax,lParam;鼠标的坐标相对于窗口左上角的坐标,高低十六位分别是X,Y坐标
and eax,0FFFFh
mov hitpoint.x,eax
mov eax,lParam
shr eax,
16
mov hitpoint.y,eax
mov MouseClick,TRUE
invoke InvalidateRect,hWnd,NULL,TRUE
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam;默认的消息处理函数
ret;退出此子程序
.ENDIF
xor eax,eax;eax置零
ret
WndProc endp
end start

 

相关文章:

  • IE新0day漏洞(979352)(又称极光零日漏洞)***将扩散
  • 苹果高清HD编辑系统
  • 支持firefox 3.6的onenote插件
  • 家长早放手,孩子早当家
  • CCNA笔记
  • vPower系列1: vMotion-没有vMotion,虚拟化只是玩具
  • 51 地图基本接口(三)
  • 从java的类装载器看安全
  • 在WPF中弹出右键菜单时判断鼠标是否选中该项
  • 唱响艾泽拉斯_职业篇
  • VMware推动虚拟化认证和教育项目
  • AllUserData表中都存储些什么?
  • 大家都有头像,我来测试下我的新头像。
  • Silverlight 异步单元测试
  • thin还是thick(续),实证新结论!
  • 【译】理解JavaScript:new 关键字
  • CAP 一致性协议及应用解析
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • jquery cookie
  • JS+CSS实现数字滚动
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Vue 动态创建 component
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端面试题总结
  • - 转 Ext2.0 form使用实例
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • !$boo在php中什么意思,php前戏
  • #NOIP 2014# day.2 T2 寻找道路
  • #QT(智能家居界面-界面切换)
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • #在 README.md 中生成项目目录结构
  • $.ajax()方法详解
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (原創) 物件導向與老子思想 (OO)
  • (转) 深度模型优化性能 调参
  • (轉)JSON.stringify 语法实例讲解
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core webapi 大文件上传到wwwroot文件夹
  • .Net MVC + EF搭建学生管理系统
  • .NET Reactor简单使用教程
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 的静态构造函数是否线程安全?答案是肯定的!