【win32汇编】0x04 第一个窗口程序
第一个win32汇编窗口程序,主要来自 win32汇编语言程序设计,然后加上了自己查阅msdn文档的一些理解,基本过程:
start入口地址 --> _WinMain主函数 --> 定义一些需要用的消息实体和类实体 --> 注册窗口类 --> 建立并显示窗口 --> 消息循环
( _ProcMain主要用于处理程序接受的消息 )
1 ;模式定义 2 ;>>>>>>>>>>>>>>>>>>>>>>> 3 .386 ;需要的指令集 (80386) 4 .model flat,stdcall 5 option casemap:none 6 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>> 7 ;Include 文件定义 8 ;>>>>>>>>>>>>>>>>>>>>>>>> 9 include windows.inc 10 include user32.inc 11 includelib user32.lib 12 include kernel32.inc 13 includelib kernel32.lib 14 15 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 16 ;数据段 17 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 18 .data? ;未初始化 19 hInstance dd ? ;本程序的句柄 20 hWinMain dd ? ;本程序主窗口 21 22 .const 23 szClassName db 'MyClass',0 ;窗口名字 24 szCaptionMain db 'My first Window !',0 ;窗口标题栏文字 25 szText db 'Win32 Assembly, Simple and powerful !',0 ;窗口文字 26 27 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 28 ;代码段 29 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 .code 31 ;******************************************************************** 32 ; 定义窗口过程 33 ; hWnd:窗口句柄 34 ; uWsg:消息标识 35 ; wParm:消息附带参数 36 ; lParam:消息附带参数 37 ;******************************************************************** 38 ;uses伪操作在进入时自动加上push,退出时自动加上pop,保护这些寄存器,否则程序出错 39 _ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam 40 local @stPs:PAINTSTRUCT ;接受绘制窗口信息 41 local @stRect:RECT 42 local @hDc 43 mov eax,uMsg 44 .if eax == WM_PAINT ;可以在showwindow或者updatewindow的时候获得这个消息,从而用这个消息来自己定制窗口 45 invoke BeginPaint,hWnd,addr @stPs 46 mov @hDc,eax ;函数是否运行成功,为NULL表示运行失败 47 invoke GetClientRect,hWnd,addr @stRect ;stRect获取窗口显示文本的信息 48 ;绘制文本 49 invoke DrawText,@hDc,addr szText,-1,\ 50 addr @stRect,\ 51 DT_SINGLELINE or DT_CENTER or DT_VCENTER 52 invoke EndPaint,hWnd,addr @stPs 53 .elseif eax == WM_CLOSE 54 invoke DestroyWindow,hWinMain ;摧毁窗口 55 invoke PostQuitMessage,NULL ;退出码(必要) 56 .else 57 invoke DefWindowProc,hWnd,uMsg,wParam,lParam ;将不感兴趣的消息交给系统处理 58 ret 59 .endif 60 61 xor eax,eax ;清空eax为0 62 ret ;一般默认返回0表示处理信息成功 63 _ProcWinMain endp 64 65 ;******************************************************************** 66 ; main函数 67 ;******************************************************************** 68 _WinMain proc 69 local @stWndClass:WNDCLASSEX ;定义实体stWndClass 70 local @stMsg:MSG ;定义消息实体 71 72 invoke GetModuleHandle,NULL ;获取当前程序的句柄 73 mov hInstance,eax ;把获得的句柄赋值给hInstance 74 invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass;清零 75 ;******************************************************************** 76 ; 注册窗口类 77 ;******************************************************************** 78 invoke LoadCursor,0,IDC_ARROW ;加载光标 79 mov @stWndClass.hCursor,eax ;光标 80 push hInstance 81 pop @stWndClass.hInstance ;窗口类所属模块 82 mov @stWndClass.cbSize,sizeof WNDCLASSEX ;WNDCLASSEX大小 83 mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW;窗口风格 84 ;指定基于这个类建立的窗口过程地址(重要) 85 mov @stWndClass.lpfnWndProc,offset _ProcWinMain 86 mov @stWndClass.hbrBackground,COLOR_WINDOW + 1 ;窗口客户区背景色 87 mov @stWndClass.lpszClassName,offset szClassName;要建立的类的命名 88 invoke RegisterClassEx,addr @stWndClass ;注册类 stWndClass 89 ;******************************************************************** 90 ; 建立并显示窗口 91 ;******************************************************************** 92 invoke CreateWindowEx, ;创建一个窗口 93 WS_EX_CLIENTEDGE,\ ;有sunken edge 的窗口??? 94 offset szClassName,\ ;窗口类的名字 95 offset szCaptionMain,\ ;窗口类的标题文字 96 WS_OVERLAPPEDWINDOW,\ ;窗口的一些属性 97 100,100,600,400,\ ;位置(x,y) 宽高(width,height) 98 NULL,NULL,\ ;可选项 99 hInstance,NULL; ;句柄,参数【可选】 100 mov hWinMain,eax ;把新建到的窗口的句柄给hWinMain 101 invoke ShowWindow,hWinMain,SW_SHOWNORMAL ;显示窗口,正常显示 102 invoke UpdateWindow,hWinMain ;更新窗口的主要部分 103 ;******************************************************************** 104 ; 消息循环 105 ;******************************************************************** 106 .while TRUE 107 invoke GetMessage,addr @stMsg,NULL,0,0 108 .break .if eax == 0 ;如果点击了退出就结束程序 109 invoke TranslateMessage,addr @stMsg ;进行键盘消息的转换 110 invoke DispatchMessage,addr @stMsg ;将消息发送到对应窗口的过程处理函数中处理 111 .endw 112 ret 113 _WinMain endp 114 115 ;******************************************************************** 116 ; 程序入口地址 117 ;******************************************************************** 118 start: 119 call _WinMain 120 invoke ExitProcess,NULL ;退出程序 121 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 122 end start
转载于:https://www.cnblogs.com/driedfish/p/5424203.html
【win32汇编】0x04 第一个窗口程序相关推荐
- 4.2第一个窗口程序
创建Win32工程和MessageBox函数 前面讲的程序都是使用控制台界面来接受输入.显示输出的.要想使用窗口界面与用户交互必须首先创建一个Win32工程. (1)运行VC++6.0,选择菜单命令& ...
- Eclipse中创建第一个窗口程序
之前在VS中用C#做程序开发时,做的最多的是Winform窗口.现在学习在Eclipse中用java编程序,也希望尽快学习如何写窗口程序,但是在选择Eclipse做开发工具的时候就听说Eclips ...
- Win32汇编——第一个窗口程序
1.窗口程序的运行模式:消息驱动 2.窗口程序实现大部分功能的代码应该呆在同一个模块中--"消息处理"模块,这个模块可以随时应付所有类型的消息,只有这样才能随时响应用户的各种操作. ...
- 汇编实验:屏幕窗口程序(代码有较为详细的注释)
实验3.4 屏幕窗口程序 1.题目:屏幕窗口程序 2.实验要求: 在屏幕上开出三个窗口,它们的行列坐标按照教材要求.光标首先定位在右窗口最下面一行的行首(15,50),如从键盘输入字符,则显示在右窗口 ...
- windows第一个窗口程序转自windows程序设计王艳平老师编著
转 目录: 1.窗口程序 2.分析 注册窗口类别 建立窗口 显示窗口 消息循环 窗口消息处理程序 3.注意事项 窗口程 ...
- 使用Qt生成第一个窗口程序
一.打开QtCreater,点击New Project 二.在Qt中,最常用的窗口程序为widgets控件程序,这里我们选择Qt Widgets Application 三.Qt生成的debug和re ...
- 汇编实验:屏幕窗口程序
实验3.4 屏幕窗口程序 1.题目:屏幕窗口程序 2.实验要求: 在屏幕上开出三个窗口,它们的行列坐标按照教材要求.光标首先定位在右窗口最下面一行的行首(15,50),如从键盘输入字符,则显示在右窗 ...
- 使用VS创建第一个窗口程序
我觉得C#或者说整个VS的开发环境或者功能对我最有吸引力的不是什么控制台程序,这种程序或者功能的实现使用Python等脚本语言实现起来似乎是更为便捷.对我真正有吸引力的是Windows的窗口程序. 接 ...
- distiller的另一个实例正忙于启动_PYQT5学习(02):利用Qt Designer制作第一个窗口程序
目标 利用Qt Designer设计窗口界面 使用PyUIC把Qt Designer生成的UI文件转换为py文件 使用转换生成的py文件 创建项目 启动启动pycharm并创建项目 这一环节在这里就不 ...
最新文章
- 关于使用css3属性:transform固定菜单位置,在滑动页面时菜单闪现抖动的问题
- SqlServer查询语句中用到的锁
- TWaver With JavaFX
- IIS组件搭建ftp服务器
- vue+webpack实践
- android如何查看cpu的占用率和内存泄漏
- Kotlin中定义编译时常量
- SHA1hash算法C语言实现
- VB制作控件之图片命令按钮➀
- 【React入门实践】结合Ant-Design从0带你手把手开发【个人中心-信息修改】页面
- 学校的计算机教室火灾级别,校园火灾事故案例统计基本数据表.doc
- 什么是云计算数据中心互连,云计算数据中心互连是如何运作的
- c#之List深度复制
- 提升睡眠质量的助眠好物,拥有这些,不再担忧睡眠质量
- 数据库 | Mysql - [索引]
- 软件测试工程师简历项目经验怎么写?--10000个已成功入职的软件测试工程师简历范文模板(含北凡老师的真实简历)
- 【Matlab学习手记】csv和xlsx格式互转
- DFS(Depth First Search,深度优先搜索)与BFS(Breadth First Search,广度优先搜索)总结与思考
- Facebook 新品 Lexical, 比 Quill 更好用的 Editor ?
- python量化实战 顾比倒数线_外汇高手分享:顾比倒数线的画法与经典战法