📄 copy.asm
字号:
_Copy proto:DWORD
__format_copy macro @lpfm
.while esi<=edi
.if isBlockSelMode
invoke _InBlock,esi,TRUE
test eax,eax
jnz @f
.else
@@:
xor eax,eax
mov al,[esi]
invoke wsprintf,addr @szBuf,@lpfm,eax
invoke _lstrcat,@lpBufData,addr @szBuf
mov @lpBufData,eax
.endif
inc esi
.endw
endm
.code
_Copy proc wParam
Local @szBuf[50]:BYTE ,lParam
Local @hMem,@Len,@lpBufData,@Count,@hEdit
pushad
mov esi,dwBlockStart
mov edi,dwBlockEnd
add esi,lpMemFile
add edi,lpMemFile
invoke _GetBlockSize
inc eax
mov @Len,eax;选择的长度
;确保长度足够
shl eax,3;8倍
add eax,50
invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_DDESHARE or GMEM_ZEROINIT ,eax
mov @hMem,eax
.if eax==0
call _ShowError
popad
ret
.endif
invoke GlobalLock,@hMem
mov @lpBufData,eax
mov eax,wParam
.if eax==IDM_EDIT_COPY_C;c/++
invoke _lstrcat, @lpBufData,ctext("unsigned char c_arr[] = {")
mov @lpBufData,eax
__format_copy ctext("0x%02X,")
mov esi,@lpBufData
mov word ptr [esi-1],";}"
.elseif eax==IDM_EDIT_COPY_PAS;pascal
.data
szfmpas db 'pas_arr: array[0..%u] of byte = ( ',0
.code
invoke _GetBlockSize
dec eax
invoke wsprintf,@lpBufData,addr szfmpas,eax
add @lpBufData,eax
__format_copy ctext("$%02X,")
mov esi,@lpBufData
mov word ptr [esi-1],";)"
.elseif eax==IDM_EDIT_COPY_VB ;vb
.data
szfmvb db "Dim vbarr",13,10,"vbarr=Array(",0
.code
invoke _lstrcat, @lpBufData,addr szfmvb
mov @lpBufData,eax
__format_copy ctext("&H%02X,")
mov esi,@lpBufData
mov BYTE ptr [esi-1],")"
.elseif eax==40005;asm
invoke _lstrcat, @lpBufData,ctext("asm_arr db ")
mov @lpBufData,eax
__format_copy ctext("%03Xh,")
mov esi,@lpBufData
mov BYTE ptr [esi-1],0
.elseif eax==40003;hex
xor edx,edx
mov eax,dwBlockStart
mov ecx,16
div ecx
mov ebx,edx
mov lParam,edx
;填充一些空格以对齐
.if !(isBlockSelMode)
mov DWORD ptr @szBuf,' '
.while edx
push edx
invoke _lstrcat,@lpBufData,addr @szBuf
mov @lpBufData,eax
pop edx
dec edx
.endw
.endif
.while esi<=edi
.if !(isBlockSelMode)
jmp @f
.else
invoke _InBlock,esi,TRUE
.if eax
@@:
xor eax,eax
mov al,[esi]
invoke wsprintf,addr @szBuf,ctext("%02X "),eax
invoke _lstrcat,@lpBufData,addr @szBuf
mov @lpBufData,eax
.if isBlockSelMode
invoke _GetBlockEnd,esi,TRUE
cmp eax,esi
jne @0
mov dx,0a0dh
mov eax,@lpBufData
mov [eax],dx
add @lpBufData,2
mov ebx,lParam
jmp @1
.else
mov eax,esi
sub eax,lpMemFile
and eax,0fh
.if eax==0fh
mov dx,0a0dh
mov eax,@lpBufData
mov [eax],dx
add @lpBufData,2
xor ebx,ebx
jmp @1
.endif
.endif
.endif
.endif
@0:
inc ebx
@1:
inc esi
.endw
.elseif eax==IDM_EDIT_COPY_STR;binary
.while esi<=edi
.if isBlockSelMode
invoke _InBlock,esi,TRUE
test eax,eax
jnz @f
.else
@@:
mov ebx,@lpBufData
mov al,[esi]
mov [ebx],al
inc @lpBufData
.endif
inc esi
.endw
.endif
invoke OpenClipboard,hWnd
invoke EmptyClipboard
invoke GlobalUnlock,@hMem
invoke SetClipboardData,CF_TEXT ,@hMem
invoke CloseClipboard
popad
ret
_Copy endp
;-------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -