📄 listview.asm
字号:
.if eax!=INVALID_HANDLE_VALUE
mov hFind,eax
xor edi,edi
.while eax
test finddata.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY
.if zero?
invoke ShowFileInfo,edi,addr finddata
inc edi
.else
invoke ShowPathInfo,edi,addr finddata
.if eax!=0ffffffffh;.和..的当前目录不显示出来。
inc edi
.endif
.endif
invoke FindNextFile,hFind,addr finddata
.endw
invoke FindClose,hFind
.endif
ret
FillFileInfo endp
ShowFileInfo proc uses edi row:dword,lpFind:dword
local lvi:LV_ITEM
local buffer[20]:BYTE
local len:DWORD
local typeFlag:dword
mov edi,lpFind
assume edi:ptr WIN32_FIND_DATA
mov lvi.imask,LVIF_TEXT+LVIF_PARAM+LVIF_IMAGE
push row
pop lvi.iItem
mov lvi.iSubItem,0
invoke lcase,addr [edi].cFileName
lea eax,[edi].cFileName
mov lvi.pszText,eax
invoke lstrlen,addr TxtExtend
mov len,eax
invoke InString,1,addr [edi].cFileName, addr TxtExtend
.if eax
mov lvi.iImage,3
mov typeFlag,1
jmp @F
.endif
invoke lstrlen,addr DocExtend
mov len,eax
invoke InString,1,addr [edi].cFileName,addr DocExtend
.if eax
mov lvi.iImage,4
mov typeFlag,2
jmp @F
.endif
invoke lstrlen,addr ExeExtend
mov len,eax
invoke InString,1,addr [edi].cFileName,addr ExeExtend
.if eax
mov lvi.iImage,5
mov typeFlag,3
jmp @F
.endif
invoke lstrlen,addr BmpExtend
mov len,eax
invoke InString,1,addr [edi].cFileName,addr BmpExtend
.if eax
mov lvi.iImage,6
mov typeFlag,4
jmp @F
.endif
mov lvi.iImage,7
mov typeFlag,0
@@:
push row
pop lvi.lParam
invoke SendMessage,hListView,LVM_INSERTITEM,0,addr lvi
mov lvi.imask,LVIF_TEXT
inc lvi.iSubItem
invoke wsprintf,addr buffer,addr char,[edi].nFileSizeLow
lea eax,buffer
mov lvi.pszText,eax
invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
.if typeFlag==1
mov lvi.pszText,offset txt
.elseif typeFlag==2
mov lvi.pszText,offset doc
.elseif typeFlag==3
mov lvi.pszText,offset exe
.elseif typeFlag==4
mov lvi.pszText,offset bmp
.else
mov lvi.pszText,offset other
.endif
inc lvi.iSubItem
invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
invoke FileTimeToSystemTime,addr [edi].ftCreationTime,addr Date_Time
mov ax,Date_Time.wYear
movzx eax,ax
invoke wsprintf,addr buffer,addr char,eax
invoke lstrcat,addr CreateDateTime,addr buffer
invoke lstrcat,addr CreateDateTime,addr interval
mov ax,Date_Time.wMonth
movzx eax,ax
invoke wsprintf,addr buffer,addr char,eax
invoke lstrcat,addr CreateDateTime,addr buffer
invoke lstrcat,addr CreateDateTime,addr interval
mov ax,Date_Time.wDay
movzx eax,ax
invoke wsprintf,addr buffer,addr char,eax
invoke lstrcat,addr CreateDateTime,addr buffer
invoke lstrcat,addr CreateDateTime,addr interval_space
mov ax,Date_Time.wHour
movzx eax,ax
invoke wsprintf,addr buffer,addr char,eax
invoke lstrcat,addr CreateDateTime,addr buffer
invoke lstrcat,addr CreateDateTime,addr interval_colon
mov ax,Date_Time.wMinute
movzx eax,ax
invoke wsprintf,addr buffer,addr char,eax
invoke lstrcat,addr CreateDateTime,addr buffer
inc lvi.iSubItem
mov lvi.pszText,offset CreateDateTime
invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
invoke RtlZeroMemory,addr CreateDateTime,sizeof CreateDateTime
assume edi:nothing
ret
ShowFileInfo endp
ShowPathInfo proc uses edi row:dword,lpFind:dword
local lvi:LV_ITEM
local buffer[40]:BYTE
mov edi,lpFind
assume edi:ptr WIN32_FIND_DATA
invoke lstrcmpi,addr [edi].cFileName,addr CurrentDirect
.if !eax
mov eax,0ffffffffh
ret
.endif
mov lvi.imask,LVIF_TEXT+LVIF_PARAM+LVIF_IMAGE
invoke lstrcmpi,addr [edi].cFileName,addr ParentDirect
.if !eax
mov eax,0ffffffffh
ret
.endif
push row
pop lvi.iItem
mov lvi.iSubItem,0
lea eax,[edi].cFileName
mov lvi.pszText,eax
mov lvi.iImage,2
push row
pop lvi.lParam
invoke SendMessage,hListView,LVM_INSERTITEM,0,addr lvi
mov lvi.imask,LVIF_TEXT
add lvi.iSubItem, 2
mov lvi.pszText,offset folder
invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
ret
ShowPathInfo endp
ExecuteFile proc
local lvi:LV_ITEM
local buffer[100]:BYTE
invoke SendMessage,hListView,LVM_GETNEXTITEM,-1,LVNI_FOCUSED
mov lvi.iItem,eax
mov lvi.iSubItem,0
mov lvi.imask,LVIF_TEXT
lea eax,buffer
mov lvi.pszText,eax
mov lvi.cchTextMax,100
invoke SendMessage,hListView,LVM_GETITEM,0,addr lvi
invoke InString,1,addr buffer,addr ExeExtend
.if eax
invoke WinExec ,addr buffer,SW_SHOW
.else
invoke MessageBox,0,addr NoExe,addr TitleName,MB_OK
.endif
ret
ExecuteFile endp
CompareFunc proc uses edi lParam1:DWORD,lParam2:DWORD,SortType:DWORD
local buffer[100]:BYTE
local buffer1[100]:BYTE
local lvi:LV_ITEM
mov lvi.imask,LVIF_TEXT
lea eax,buffer
mov lvi.pszText,eax
mov lvi.cchTextMax,100
.if SortType==1
;invoke MessageBox,NULL,addr ClassName,addr TitleName,MB_OK;检测两两比较的执行过程。
mov lvi.iSubItem,1
invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam1,addr lvi
invoke atodw ,addr buffer
mov edi,eax
invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam2,addr lvi
invoke atodw,addr buffer
sub edi,eax
mov eax,edi
.elseif SortType==2
mov lvi.iSubItem,1
invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam1,addr lvi
invoke atodw,addr buffer
mov edi,eax
invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam2,addr lvi
invoke atodw,addr buffer
sub eax,edi
.elseif SortType==3
mov lvi.iSubItem,0
invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam1,addr lvi
invoke lstrcpy,addr buffer1,addr buffer
invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam2,addr lvi
invoke lstrcmpi,addr buffer1,addr buffer
.else
mov lvi.iSubItem,0
invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam1,addr lvi
invoke lstrcpy,addr buffer1,addr buffer
invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam2,addr lvi
invoke lstrcmpi,addr buffer,addr buffer1
.endif
ret
CompareFunc endp
UpdatelParam proc uses edi
local lvi:LV_ITEM
invoke SendMessage,hListView,LVM_GETITEMCOUNT,0,0
mov edi,eax
mov lvi.imask,LVIF_PARAM
mov lvi.iSubItem,0
mov lvi.iItem,0
.while edi>0
push lvi.iItem
pop lvi.lParam
invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
inc lvi.iItem
dec edi
.endw
ret
UpdatelParam endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -