【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
时间: 2024-08-12 16:03:45

【win32汇编】0x04 第一个窗口程序的相关文章

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首先我们知道32位汇编是可以调用Windows API的,那么今天我们就调用windowsAPI来写一个窗口程序 如果你有windows开发知识,那么就很理解了,如果没有,那么跟着我写,跟着步骤去写,那么也可以写出来 首先我们要编写一个窗口程序(使用SDKAPI编写)有几个步骤 1.设计窗口类 2.注

【DirectX11-Tutorial】编写第一个窗口程序creating a window

本系列主要参考此博客的文章l,同时会加上一点个人实践过程. ========================================== 分割线 ========================================== 这篇文章主要分为三个部分,首先是看一下创建窗口完整的代码,然后了解程序运作的主要细节,最后如何修改这些代码. 接下来开始第一个窗口程序,上一个程序中使用WinMain()函数开始整个程序,这一次将结合另一个函数WinProc(),这个函数将处理程序每一个系统运

win32汇编--第一个窗体程序

窗口创建过程     GetModuleHandle->RtlZeroMemory->LoadCursor->RegisterClassEx->CreateWindowsEx->ShowWindow->UpdateWindow 获得模块句柄->结构体初始化(填0)->加载光标->注册窗体类->创建窗体->显示窗体->更新客户区 win32API函数定义 GetModuleHandle,lpModuleName 参数:lpModuleN

win32汇编实现一个简单的TCP服务端程序(WinSock的简单认知应用)

Windows网络编程,相信好多人都知道,但是我们一般都是用其他语言编写,例如C,C++,JAVA,python等等,这些语言都可以,但是汇编语言比较底层,利用它,我们可以更清晰的了解到网络编程的内在部分,这是其他语言不能相比的,好了,废话不多说,这其实就是这次的目的(毕竟水平欠缺,还是先来按照罗云斌老师的WIN32汇编书上的例子加以学习,举一反三吧). 说道网络编程,现在我所接触到的程序开发,工具软件的使用,库等等都是基于Windows平台的,想要了解Windows的网络编程就必须要知道Win

win32窗口程序的过程

复习一下win32窗口程序 设计一个窗口类: 注册窗口类: 创建窗口: 显示及更新窗口. 消息循环,去获取消息: 窗口过程函数的消息响应. 设计窗口类: typedef struct _WNDCLASS { UINT style; //窗口类的类型 WNDPROC lpfnWndProc; //窗口过程函数(回调函数) int cbClsExtra; //为该类设定额外内存空间 int cbWndExtra; //为该窗口设定额外内存空间 HANDLE hInstance; //当前应用程序的实

C语言实现Win32第一个窗口

Windows顾名思义就是窗口,将窗口程序加入到操作系统中具有里程碑式的意义.掌握窗口程序的实现是学习Win32程序实现的重要环节. 一个Win32窗口程序的实现通常要经历下面3个步骤: 1.注册窗口(窗口的风格.图标.光标.大小等) 2.创建.显示窗口 3.消息循环. 同时需要一个入口函数WinMain和一个消息响应函数. WinMain()函数是应用程序开始执行时的入口点,通常也是应用程序结束任务退出时的出口点.它与DOS程序的main()函数起同样的作用,不同的是,WinMain()函数必

delphi程序向另一个可执行程序发消息(使用GetForegroundWindow; 找出当前操作系统中活动的第一个窗口)

function FindWindowThroughWindowText(WindowText: string): THandle;var  hCurrentWindow: THandle;  cnt: Integer;  WindowTitle: array [0 .. 254] of Char;begin  Result := INVALID_HANDLE_VALUE; // 返回值预设为无效的句柄  hCurrentWindow := GetForegroundWindow; // 找出当

谈Win32汇编

最近接触到Win32汇编,才知道汇编必须是和平台相关的,如做应用则和操作系统和CPU类型相关,而做操作系统就和只和的CPU类型有关.对于<微机原理>里面的汇编,那是DOS汇编,而Win32汇编是基于Windows的汇编.DOS和Windows是两个完全不同的操作系统了. DOS汇编功能的实现依靠的是DOS系统提供的软中断,DOS程序是面向过程的单任务的:而Win32汇编功能的实现依靠的是WinAPI,基本的元素是与具体CPU类型有关的汇编指令(一般都是X86啦,因为微软就支持这个~~).然后记

第一章 Windows程序内部运行机制(4)WinMain函数

WinMain函数相当于main函数,作为Windows程序的入口函数.当WinMain结束或返回时,Windows程序结束. 一个win32应用程序,该程序创建一个窗口并在窗口中响应键盘与鼠标消息,程序的实现步骤为: 1.WinMain函数的定义:2.创建一个窗口:3.进行消息循环:4.编写窗口过程 WinMain函数的定义: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, in