win32汇编环境下,双击窗口程序内生成的listview列表控件的某行,并提取其内容的示例程序

;上源码,仔细研究里面的几条备注就理解原理了

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Sample code for < Win32ASM Programming >

; by 罗云彬, http://asm.yeah.net

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; FirstWindow.asm

; 窗口程序的模板代码

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 使用 nmake 或下列命令进行编译和链接:

; ml /c /coff FirstWindow.asm

; Link /subsystem:windows FirstWindow.obj

;抄了罗云彬的模版,特留上面内容

;提取窗口程序内生成的listview列表控件的内容示例程序

;抄下面源码,可以在radasm里面直接编译运行。主要的部分加了备注。

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.386

.model flat,stdcall

option casemap:none

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Include 文件定义

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include windows.inc

include gdi32.inc

includelib gdi32.lib

include user32.inc

includelib user32.lib

include kernel32.inc

includelib kernel32.lib

include gdi32.inc ;加入这个

includelib gdi32.lib ;加入这个

include comctl32.inc ;加入这个

includelib comctl32.lib ;加入这个

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data?

hInstance dd ?

hWinMain dd ?

h_List dd ?

.const

szClassName db 'MyClass',0

szCaptionMain db 'win32汇编环境窗口程序listview列表控件点击排序示例',0

sz_Colon_Signal db ':',0 ;冒号

sz_Enter_Signal db 0dh,0ah,0 ;回车换行符

szDblickName_List db "当前双击的是",0

szlistViewClassName db "SysListView32",0 ;加这个

Heading1 db "序号",0 ;第1列名称

Heading2 db "姓名",0 ;第1列名称

Heading3 db "性别",0

Heading2_1 db "刘备",0 ;第2列第1行字符串

Heading2_2 db "绍婵",0 ;第2列第2行字符串

Heading2_3 db "关羽",0

Heading2_4 db "西施",0

Heading3_1 db "男",0

Heading3_2 db "女",0

Heading3_3 db "男",0

Heading3_4 db "女",0

.data

sztemplate db "%d",0 ;格式化序号用

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代码段

.code

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

RGB macro red,green,blue ;颜色宏,让listview列表控件好看点

xor eax,eax

mov ah,blue

shl eax,8

mov ah,green

mov al,red

endm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ShowCurrentFocus proc ;提取被双击到的某项内容

LOCAL lvi:LV_ITEM

LOCAL szbuffer[256]:BYTE

LOCAL szAllShowbuffer[256]:BYTE

invoke RtlZeroMemory,addr szbuffer,sizeof szbuffer

invoke RtlZeroMemory,addr szAllShowbuffer,sizeof szAllShowbuffer ;缓冲区清空,防止此片内存有残留内容。

invoke SendMessage,h_List,LVM_GETNEXTITEM,-1, LVNI_FOCUSED ;LVM_GETNEXTITEM消息搜索有指定属性的行,比如指定LVNI_FOCUSED属性,而LVNI_FOCUSED就是具有焦点,即被选中的行

mov lvi.iItem,eax

mov lvi.iSubItem,0

mov lvi.imask,LVIF_TEXT

lea eax,szbuffer

mov lvi.pszText,eax

mov lvi.cchTextMax,256

invoke SendMessage,h_List,LVM_GETITEM,0,addr lvi

invoke lstrcat,addr szAllShowbuffer,addr Heading1

invoke lstrcat,addr szAllShowbuffer,addr sz_Colon_Signal ;加冒号

invoke lstrcat,addr szAllShowbuffer,addr szbuffer ;加提取到的数据

invoke lstrcat,addr szAllShowbuffer,addr sz_Enter_Signal ;加回车换行

mov lvi.iSubItem,1

mov lvi.imask,LVIF_TEXT

lea eax,szbuffer

mov lvi.pszText,eax

mov lvi.cchTextMax,256

invoke SendMessage,h_List,LVM_GETITEM,0,addr lvi

invoke lstrcat,addr szAllShowbuffer,addr Heading2

invoke lstrcat,addr szAllShowbuffer,addr sz_Colon_Signal

invoke lstrcat,addr szAllShowbuffer,addr szbuffer

invoke lstrcat,addr szAllShowbuffer,addr sz_Enter_Signal ;加回车换行

mov lvi.iSubItem,2

mov lvi.imask,LVIF_TEXT

lea eax,szbuffer

mov lvi.pszText,eax

mov lvi.cchTextMax,256

invoke SendMessage,h_List,LVM_GETITEM,0,addr lvi

invoke lstrcat,addr szAllShowbuffer,addr Heading3

invoke lstrcat,addr szAllShowbuffer,addr sz_Colon_Signal

invoke lstrcat,addr szAllShowbuffer,addr szbuffer

invoke MessageBox,0, addr szAllShowbuffer,addr szDblickName_List,MB_OK or MB_ICONINFORMATION

ret

_ShowCurrentFocus endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ShowListViewInfo proc ;显示列表视图里的每项信息

LOCAL lvItem:LV_ITEM

LOCAL @buffer[10]:byte

;以下填充第1行的内容

mov lvItem.imask,LVIF_TEXT

mov lvItem.iItem, 0 ;0为第1列,从0开始计算

mov lvItem.iSubItem, 0 ;0为第1行

invoke wsprintf,addr @buffer, addr sztemplate,1 ;格式化第1列第1行要显示的字符串

lea eax, @buffer

mov lvItem.pszText, eax

mov lvItem.cchTextMax, sizeof Heading1

invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem

mov lvItem.imask,LVIF_TEXT

mov lvItem.iSubItem,1

lea eax,offset Heading2_1

mov lvItem.pszText,eax

invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem

mov lvItem.imask,LVIF_TEXT

mov lvItem.iSubItem,2

lea eax,offset Heading3_1

mov lvItem.pszText,eax

invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem

;以下填充第2行的内容

mov lvItem.iItem, 1

mov lvItem.iSubItem, 0

invoke wsprintf,addr @buffer, addr sztemplate,2 ;第1列第2行字符串

lea eax, @buffer

mov lvItem.pszText, eax

invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem

mov lvItem.imask,LVIF_TEXT

mov lvItem.iSubItem,1

lea eax,offset Heading2_2

mov lvItem.pszText,eax

invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem

mov lvItem.imask,LVIF_TEXT

mov lvItem.iSubItem,2

lea eax,offset Heading3_2

mov lvItem.pszText,eax

invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem

;以下填充第3行的内容

mov lvItem.iItem, 2

mov lvItem.iSubItem, 0

invoke wsprintf,addr @buffer, addr sztemplate,3 ;第1列第3行字符串

lea eax, @buffer

mov lvItem.pszText, eax

invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem

mov lvItem.imask,LVIF_TEXT

mov lvItem.iSubItem,1

lea eax,offset Heading2_3

mov lvItem.pszText,eax

invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem

mov lvItem.imask,LVIF_TEXT

mov lvItem.iSubItem,2

lea eax,offset Heading3_3

mov lvItem.pszText,eax

invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem

;以下填充第4行的内容

mov lvItem.iItem, 3

mov lvItem.iSubItem, 0

invoke wsprintf,addr @buffer, addr sztemplate,4 ;第1列第4行字符串

lea eax, @buffer

mov lvItem.pszText, eax

invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem

mov lvItem.imask,LVIF_TEXT

mov lvItem.iSubItem,1

lea eax,offset Heading2_4

mov lvItem.pszText,eax

invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem

mov lvItem.imask,LVIF_TEXT

mov lvItem.iSubItem,2

lea eax,offset Heading3_4

mov lvItem.pszText,eax

invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem

ret

_ShowListViewInfo endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_List_InsertColumn proc ;插入列数及名称的函数

LOCAL lvc:LV_COLUMN

mov lvc.imask,LVCF_TEXT+LVCF_WIDTH

mov lvc.pszText,offset Heading1 ;第1列的标题栏名称

mov lvc.lx,100 ;宽度

invoke SendMessage,h_List, LVM_INSERTCOLUMN, 0, addr lvc

or lvc.imask,LVCF_FMT

mov lvc.fmt,LVCFMT_LEFT

mov lvc.pszText,offset Heading2 ;第2列的标题栏名称

mov lvc.lx,150

invoke SendMessage,h_List, LVM_INSERTCOLUMN, 1 ,addr lvc

mov lvc.pszText,offset Heading3

mov lvc.lx,125

invoke SendMessage,h_List, LVM_INSERTCOLUMN, 2 ,addr lvc

ret

_List_InsertColumn endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 窗口过程

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam

local @stPs:PAINTSTRUCT

local @stRect:RECT

local @hDc

LOCAL @DEFAULT_GUI_FONT,@OLD_DEFAULT_GUI_FONT ;加入这个,字体使用

mov eax,uMsg

;********************************************************************

.if eax == WM_PAINT

invoke BeginPaint,hWnd,addr @stPs

invoke EndPaint,hWnd,addr @stPs

.elseif eax == WM_CREATE

mov eax,hWnd

mov hWinMain,eax

invoke GetStockObject,DEFAULT_GUI_FONT

mov @DEFAULT_GUI_FONT,eax

invoke CreateWindowEx, NULL, addr szlistViewClassName, NULL, LVS_REPORT or WS_CHILD or WS_VISIBLE, \ ;名单列表视图

0,0,0,0,hWnd, NULL, hInstance, NULL

mov h_List, eax

mov eax,LVS_EX_FULLROWSELECT or LVS_EX_GRIDLINES or LVS_EX_SUBITEMIMAGES ;设置ListView全行选择,网格等样式.

invoke SendMessage,h_List,LVM_SETEXTENDEDLISTVIEWSTYLE,0,eax

invoke ImageList_Create,0,35,ILC_COLORDDB or ILC_MASK,0,0 ;调整ImageList高,就可调整listView行高,就是把它撑大点

invoke SendMessage,h_List,LVM_SETIMAGELIST,LVSIL_SMALL,eax

invoke SendMessage,h_List,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE

RGB 0,0,0

invoke SendMessage,h_List,LVM_SETTEXTCOLOR,0,eax ;设置文本颜色

RGB 131,175,155

invoke SendMessage,h_List,LVM_SETBKCOLOR,0,eax ;设置背景颜色

RGB 131,175,155

invoke SendMessage,h_List,LVM_SETTEXTBKCOLOR,0,eax ;设置文本背景颜色

invoke MoveWindow,h_List,0,0,375,520,TRUE ;调整列表视图的位置才能显示出来

invoke _List_InsertColumn ;调用初始化ListView控件的函数

invoke _ShowListViewInfo ;调用初始化显示列表视图内容的函数

.elseif eax== WM_NOTIFY ;当事件发生或控件需要一些信息时,由公共控件发送到其父窗口。

push edi

mov edi,lParam ;接收到了 WM_NOTIFY 消息后,lParam 包含了指向 NMHDR 型结构体变量的指针。我们通过把列表视图控件的值和 NMHDR 型

assume edi:ptr NMHDR ;结构体变量中的 hwndFrom 成员变量的值比较来判断,如果相等的话就可以确定消息是列表视图控件发送的

mov eax,[edi].hwndFrom

.if eax==h_List

.if [edi].code==NM_DBLCLK ;双击项目显示第一条信息

invoke _ShowCurrentFocus ;调用提取listview控件内容并弹出信息的函数

.endif

.endif

pop edi

;********************************************************************

.elseif eax == WM_CLOSE

invoke DestroyWindow,hWinMain

invoke PostQuitMessage,NULL

;********************************************************************

.else

invoke DefWindowProc,hWnd,uMsg,wParam,lParam

ret

.endif

;********************************************************************

xor eax,eax

ret

_ProcWinMain endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_WinMain proc

local @stWndClass:WNDCLASSEX

local @stMsg:MSG

invoke InitCommonControls ;加上这句

invoke GetModuleHandle,NULL

mov hInstance,eax

invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass

;********************************************************************

; 注册窗口类

;********************************************************************

invoke LoadCursor,0,IDC_ARROW

mov @stWndClass.hCursor,eax

push hInstance

pop @stWndClass.hInstance

mov @stWndClass.cbSize,sizeof WNDCLASSEX

mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW

mov @stWndClass.lpfnWndProc,offset _ProcWinMain

mov @stWndClass.hbrBackground,COLOR_WINDOW + 1

mov @stWndClass.lpszClassName,offset szClassName

invoke RegisterClassEx,addr @stWndClass

;********************************************************************

; 建立并显示窗口

;********************************************************************

invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\

WS_OVERLAPPEDWINDOW,\

100,100,395,420,\

NULL,NULL,hInstance,NULL

mov hWinMain,eax

invoke ShowWindow,hWinMain,SW_SHOWNORMAL

invoke UpdateWindow,hWinMain

;********************************************************************

; 消息循环

;********************************************************************

.while TRUE

invoke GetMessage,addr @stMsg,NULL,0,0

.break .if eax == 0

invoke TranslateMessage,addr @stMsg

invoke DispatchMessage,addr @stMsg

.endw

ret

_WinMain endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

start:

call _WinMain

invoke ExitProcess,NULL

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

end start

;运行效果

;双击后

相关推荐
九章云极AladdinEdu13 小时前
GPU SIMT架构的极限压榨:PTX汇编指令级并行优化实践
汇编·人工智能·pytorch·python·深度学习·架构·gpu算力
染指111017 小时前
25.第二阶段x64游戏实战-分析物品相关数据
汇编·游戏·游戏逆向·x64dbg·x64游戏
pigfu4 天前
go 通过汇编学习atomic原子操作原理
汇编·golang·atomic·缓存行·lock指令
小鹿撞出了脑震荡5 天前
汇编学习——iOS开发对arm64汇编的初步了解
汇编·学习·ios
染指11106 天前
21.第二阶段x64游戏实战-分析采集物偏移
汇编·游戏·反游戏外挂·游戏逆向·x64dbg·x64游戏
楠木s9 天前
常见汇编代码及其指定
java·汇编·数据库·安全·网络攻击模型·二进制·栈溢出
suyong_yq12 天前
调试Cortex-M85 MCU启动汇编和链接命令文件 - 解题一则
汇编·arm开发·嵌入式系统
染指111015 天前
18.第二阶段x64游戏实战-MFC列表框
汇编·c++·windows·游戏·游戏逆向·x64dbg
RaLi和夕18 天前
单片机学习笔记9.数码管
汇编·笔记·单片机·嵌入式硬件·学习
yu41062118 天前
GCC 内建函数汇编展开详解
汇编