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

;运行效果

;双击后

相关推荐
肖无疾6 小时前
在CE自动汇编里调用lua函数
汇编·lua·ce
冬瓜3122 天前
汇编点灯练习
汇编·arm
矮油0_o2 天前
30天开发操作系统 第 10 天 -- 叠加处理
开发语言·汇编·数据结构·c++·算法·操作系统
一品人家3 天前
win32汇编环境下,对话框程序中生成listview列表控件,点击标题栏自动排序的示例
汇编·windows·microsoft
一品人家3 天前
win32汇编环境下,提取对话框程序中,listview列表控件里的内容示例
汇编·microsoft
代码巨匠4 天前
汇编指令总结、练习、C与汇编混合使用
汇编
Crossoads4 天前
【汇编语言】外中断(二)—— 键盘的奥秘:编写自己的 int 9 中断例程
android·开发语言·javascript·网络·汇编·机器学习·计算机外设
あjdc5 天前
基于汇编实现 hook objc_msgSend,统计方法耗时的方案
汇编·macos·ios·objective-c·cocoa
雪碧透心凉_5 天前
8086汇编(16位汇编)学习笔记03.汇编指令
汇编·笔记·学习