📄 xp.asm
字号:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comctl32.inc
include \masm32\include\gdi32.inc
include \masm32\include\shell32.inc
include \masm32\include\advapi32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comctl32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\masm32.lib
MapXPWindow PROTO :DWORD,:DWORD,:DWORD,:DWORD
MakeRegion PROTO :DWORD,:DWORD,:DWORD
DrawGroupBox PROTO :DWORD,:DWORD,:DWORD,:DWORD
WindowCenterProc PROTO :DWORD
CalcXY PROTO :DWORD,:DWORD,:DWORD,:DWORD
MoveXY PROTO :DWORD,:DWORD
MoveSubWindowToDown PROTO :DWORD
EnumAndMoveChild PROTO :DWORD,:DWORD
CalcWindowHighWidth PROTO :DWORD
DrawTitleButton PROTO :DWORD
FloatButtonProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawCheckButton PROTO :DWORD,:DWORD,:DWORD,:DWORD
UpdateFloatButton PROTO :DWORD,:DWORD,:DWORD,:DWORD
InitFloatTitleButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
InitXpResource PROTO
DrawRectEdge PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawBmpButton PROTO :DWORD
ClassBmpButton PROTO :DWORD
ClickSubSystemMenu PROTO :DWORD,:DWORD
SetBmpColor PROTO :DWORD,:DWORD,:DWORD,:DWORD
ControlCommand PROTO :DWORD,:DWORD
DrawReadWriteEdit PROTO :DWORD,:DWORD,:DWORD,:DWORD
SubClassesWinProc PROTO :DWORD,:DWORD,:DWORD
DrawMenuItem PROTO :DWORD
CreateRightMenu PROTO
ModifyXPMenu PROTO :DWORD,:DWORD
ControlMenu PROTO :DWORD
InitXPMenu PROTO :DWORD
DrawReadOnlyEdit PROTO :DWORD,:DWORD,:DWORD,:DWORD
ShowRightMenu PROTO :DWORD,:DWORD
InitSubSystemMenu PROTO :DWORD
MemFill PROTO :DWORD,:DWORD
PopupSubSystemMenu PROTO :DWORD,:DWORD
DeleteXpResource PROTO
DrawComboBoxItem PROTO :DWORD,:DWORD,:DWORD,:DWORD
AddListDataSub PROTO :DWORD,:DWORD,:DWORD
DrawUdmItem PROTO :DWORD,:DWORD,:DWORD,:DWORD
HyperLinkProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawXpWinEdge PROTO :DWORD,:DWORD
GetWindowIcon PROTO :DWORD
DrawRoundRect PROTO :DWORD,:DWORD,:DWORD
ClassesWinProc PROTO :DWORD,:DWORD
IsEmailHttp PROTO :DWORD
DrawProgressBar PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawSysList32Head PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawColumn PROTO :DWORD,:DWORD,:DWORD
EnumAndPaintChild PROTO :DWORD,:DWORD
XPBKCOLOR equ 0d0e8efh
XPEDGECOLOR equ 0b99d7fh
XPMENUCOLOR equ 0c0c8c0h
XPGROUPCOLOR equ 0bfd0d0h
XPTITLEBACKCOLOR equ Black
XPTITLEFORECOLOR equ White
XPHTTPLINKCOLOR equ 0bf00h
BMP_TITLE_WIDTH equ 16
BMP_TITLE_HEIGHT equ 29
PBS_SMOOTH equ 1
PBS_VERTICAL equ 4
PBM_SETRANGE32 equ WM_USER+6 ; lParam = high, wParam = low
PBM_GETRANGE equ WM_USER+7 ; wParam = return (TRUE ? low : high). lParam = PPBRANGE or NULL
PBM_GETPOS equ WM_USER+8
PBM_SETBARCOLOR equ WM_USER+9 ; lParam = bar color
PBM_SETBKCOLOR equ CCM_SETBKCOLOR ; lParam = bkColor
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
STEXT MACRO Text
local szText
LOCAL lbl
jmp lbl
szText db Text,0
lbl:
exitm <offset szText>
ENDM
.data?
hBmpTitleLeft dd ?
hBmpTitleRight dd ?
hBmpTitleCenter dd ?
hBmpCloseNoActive dd ?
hBmpCloseActive dd ?
hBmpCloseDown dd ?
hButtonBmpNoActive dd ?
hButtonBmpSetFocus dd ?
hButtonBmpActive dd ?
hButtonBmpDown dd ?
hButtonBmpDisable dd ?
hBmpMaxDisable dd ?
hBmpMinNoActive dd ?
hBmpMinActive dd ?
hBmpMinDown dd ?
hXpBrush dd ?
hdwp dd ?
hInstance dd ?
.data
hFirstWin dd 0
hDrawWin dd 0
.code
MapXPWindow proc uses esi edi ebx,hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL hdc :DWORD
LOCAL hCurRgn :DWORD
LOCAL hTempRgn :DWORD
LOCAL hTitleFont :DWORD
LOCAL hBakFont :DWORD,hBakMode:DWORD,hTxtColor:DWORD
LOCAL @hFontOutput:DWORD
LOCAL @hWinTemp :DWORD
LOCAL @stFont :LOGFONT
LOCAL rct :RECT
LOCAL Ps :PAINTSTRUCT
LOCAL TempBuffer [MAX_PATH]:BYTE
push eax
mov eax,uMsg
.if eax == WM_INITDIALOG || eax == WM_CREATE
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_KEYMENU,addr TempBuffer
.if hFirstWin == 0
m2m hFirstWin,hWin
invoke InitXpResource
.endif
invoke LoadIcon,hInstance,lParam
.if eax != 0
invoke SendMessage,hWin,WM_SETICON,ICON_BIG,eax ; 设置窗口图标
.endif
invoke InitSubSystemMenu,hWin ; 初使化系统菜单
; 去掉窗口标题栏
invoke GetWindowLong,hWin,GWL_STYLE
and eax,not (WS_CAPTION or WS_THICKFRAME or DS_MODALFRAME)
invoke SetWindowLong,hWin,GWL_STYLE,eax
invoke GetWindowLong,hWin,GWL_EXSTYLE
and eax,not (WS_EX_WINDOWEDGE or WS_EX_DLGMODALFRAME)
invoke SetWindowLong,hWin,GWL_EXSTYLE,eax
invoke MoveSubWindowToDown,hWin ; 移动并子类化所有子窗口
; 初使化类XP窗口
invoke GetClientRect,hWin,addr rct
mov ebx,rct.right
sub ebx,26 ; 创建关闭按钮
invoke InitFloatTitleButton,hWin,SC_CLOSE,ebx,5,21,21
invoke GetWindowLong,hWin,GWL_STYLE
.if eax & WS_MINIMIZEBOX
sub ebx,23
invoke InitFloatTitleButton,hWin,SC_MAXIMIZE,ebx,5,21,21
sub ebx,23
invoke InitFloatTitleButton,hWin,SC_MINIMIZE,ebx,5,21,21
.endif
invoke WindowCenterProc,hWin
m2m eax,1
.elseif eax == WM_SETTEXT ; 处理这两个消息以响应修改窗口文本或状态时重绘窗口
invoke GetClientRect,hWin,addr rct
invoke CreateRectRgnIndirect,addr rct
mov hCurRgn,eax
invoke InflateRect,addr rct,-3,-3
add rct.top,26
invoke CreateRectRgnIndirect,addr rct
mov hTempRgn,eax
invoke CombineRgn,hCurRgn,hCurRgn,hTempRgn,RGN_DIFF
invoke RedrawWindow,hWin,0,hCurRgn,RDW_INVALIDATE
invoke DeleteObject,hTempRgn
invoke DeleteObject,hCurRgn
.elseif eax == WM_PAINT ; 绘制窗口标题栏
mov eax,hWin
.if eax != hDrawWin
invoke MakeRegion,hWin,hBmpTitleLeft,hBmpTitleRight ; 修改窗口边框为位图形状
m2m hDrawWin,hWin
.endif
invoke BeginPaint,hWin,addr Ps
mov hdc,eax
invoke GetBkMode,hdc
mov hBakMode,eax
invoke GetTextColor,hdc
mov hTxtColor,eax
invoke GetClientRect,hWin,addr rct
invoke DrawXpWinEdge,hdc,addr rct
invoke SendMessage,hWin,WM_GETFONT,0,0
mov hTitleFont,eax
invoke GetObject,hTitleFont,sizeof LOGFONT,addr @stFont
dec @stFont.lfHeight
mov @stFont.lfWeight,FW_BOLD
invoke CreateFontIndirect,addr @stFont
mov hTitleFont,eax
invoke SelectObject,hdc,hTitleFont
mov hBakFont,eax
invoke SetBkMode,hdc,TRANSPARENT
invoke GetWindowText,hWin,addr TempBuffer,sizeof TempBuffer
invoke SetTextColor,hdc,XPTITLEBACKCOLOR
invoke GetWindowIcon,hWin ; 获取窗口图标
.if eax != 0
invoke DrawIconEx,hdc,6,6,eax,16,16,0,0,DI_NORMAL ; 绘制标题栏图标
add rct.left,30
.else
add rct.left,10
.endif
add rct.top,10
sub rct.right,26
mov rct.bottom,BMP_TITLE_HEIGHT ; 绘制窗口标题文字
invoke DrawText,hdc,addr TempBuffer,-1,addr rct,DT_SINGLELINE
invoke SetTextColor,hdc,XPTITLEFORECOLOR
invoke OffsetRect,addr rct,-1,-1
invoke DrawText,hdc,addr TempBuffer,-1,addr rct,DT_SINGLELINE
invoke SelectObject,hdc,hBakFont
invoke DeleteObject,hTitleFont
invoke EnumChildWindows,hWin,addr EnumAndPaintChild,hWin
invoke SetTextColor,hdc,hTxtColor
invoke SetBkMode,hdc,hBakMode
invoke EndPaint,hWin,addr Ps
xor eax,eax
.elseif eax == WM_DRAWITEM ; 绘制XP风格的按钮
mov eax,lParam
.if [eax.DRAWITEMSTRUCT].CtlType == ODT_BUTTON
invoke DrawBmpButton,lParam
.elseif [eax.DRAWITEMSTRUCT].CtlType == ODT_STATIC
invoke DrawTitleButton,lParam
.elseif [eax.DRAWITEMSTRUCT].CtlType == ODT_MENU
invoke DrawMenuItem,lParam ; 绘制菜单
.endif
m2m eax,1
.elseif eax == WM_CTLCOLORDLG || eax == WM_CTLCOLORBTN
mov eax,hXpBrush
.elseif eax == WM_CTLCOLORSTATIC
invoke GetClassName,lParam,addr TempBuffer,sizeof TempBuffer
invoke lstrcmpi,addr TempBuffer,STEXT('STATIC')
.if eax == 0
invoke SetBkMode,wParam,TRANSPARENT
mov eax,hXpBrush
.else
invoke lstrcmpi,addr TempBuffer,STEXT('EDIT')
.if eax == 0
invoke SetBkMode,wParam,TRANSPARENT
invoke GetClientRect,lParam,addr rct
invoke InflateRect,addr rct,1,1
;invoke GetSysColor,COLOR_GRAYTEXT
invoke DrawRectEdge,wParam,addr rct,XPEDGECOLOR,1
invoke SetBkColor,wParam,XPBKCOLOR
mov eax,hXpBrush
.else
xor eax,eax
.endif
.endif
.elseif eax == WM_CTLCOLOREDIT
invoke GetClassName,lParam,addr TempBuffer,sizeof TempBuffer
invoke lstrcmpi,addr TempBuffer,STEXT('EDIT')
.if eax == 0
invoke SetBkMode,wParam,TRANSPARENT
invoke GetClientRect,lParam,addr rct
invoke InflateRect,addr rct,1,1
invoke GetWindow,lParam,GW_HWNDNEXT
.if eax != 0
mov hdc,eax
lea eax,TempBuffer
invoke GetClassName,hdc,eax,sizeof TempBuffer
invoke lstrcmpi,addr TempBuffer,STEXT('msctls_updown32')
.if eax == 0
invoke GetWindowLong,hdc,GWL_STYLE
.if eax & UDS_AUTOBUDDY
m2m eax,2
.else
m2m eax,1
.endif
.else
m2m eax,1
.endif
.else
m2m eax,1
.endif
invoke DrawRectEdge,wParam,addr rct,XPEDGECOLOR,eax
invoke SetBkColor,wParam,White
invoke GetStockObject,WHITE_BRUSH
.else
xor eax,eax
.endif
.elseif eax == WM_RBUTTONUP ; 标题栏上右键弹出的系统菜单
invoke PopupSubSystemMenu,hWin,lParam
.elseif eax == WM_LBUTTONDOWN || (eax == WM_SYSCOMMAND && wParam == SC_KEYMENU) ; 标题栏上左键弹出的系统菜单
invoke ClickSubSystemMenu,hWin,lParam
.elseif eax == WM_MEASUREITEM
invoke ModifyXPMenu,hWin,lParam ; 设置菜单高度和宽度
.elseif eax == WM_COMMAND
mov eax,wParam
.if eax == SC_CLOSE
invoke PostMessage,hWin,WM_CLOSE,0,0
.elseif eax == SC_MOVE || eax == SC_RESTORE || eax == SC_SIZE || eax == SC_MAXIMIZE
invoke SendMessage,hWin,WM_SYSCOMMAND,eax,0 ; 接收系统命令
.elseif eax == SC_MINIMIZE
invoke CloseWindow,hWin
.elseif word ptr wParam+2 == CBN_DROPDOWN || word ptr wParam+2 == CBN_CLOSEUP
invoke GetClassName,lParam,addr TempBuffer,sizeof TempBuffer
invoke lstrcmpi,addr TempBuffer,STEXT('ComboBox')
.if eax == 0
.if word ptr wParam+2 == CBN_DROPDOWN
inc hComboBoxDrop
invoke RedrawWindow,lParam,0,0,RDW_INVALIDATE
.elseif word ptr wParam+2 == CBN_CLOSEUP
mov hComboBoxDrop,0
invoke RedrawWindow,lParam,0,0,RDW_INVALIDATE
.endif
.endif
.endif
m2m eax,1
.elseif eax == WM_DESTROY
invoke GetWindowIcon,hWin
.if eax != 0
invoke DestroyIcon,eax
.endif
mov eax,hWin
.if eax == hFirstWin
invoke DeleteXpResource
m2m hFirstWin,0
.endif
xor eax,eax
.elseif eax == WM_CLOSE
invoke EndDialog,hWin,lParam
m2m eax,1
.else
pop eax
jmp NEXT_SET
.endif
pop ecx
NEXT_SET:
ret
MapXPWindow endp
; 居中窗口
WindowCenterProc proc hWin:DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
LOCAL rct :RECT
LOCAL rect:RECT
invoke GetParent,hWin
.if eax == 0 ; 如果是主窗口
invoke GetClientRect,hWin,addr rct
invoke GetSystemMetrics,SM_CXSCREEN
invoke MoveXY,rct.right,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN
invoke MoveXY,rct.bottom,eax
mov Wty, eax
invoke SetWindowPos,hWin,0,Wtx,Wty,0,0,SWP_NOSIZE or SWP_NOZORDER
.else ; 如果是子窗口
lea edx,rct
invoke GetWindowRect,eax,edx
invoke GetWindowRect,hWin,addr rect
invoke CalcXY,rect.left,rect.right,rct.left,rct.right
mov rct.left,eax
mov rect.right,edx
invoke CalcXY,rect.top,rect.bottom,rct.top,rct.bottom
invoke MoveWindow,hWin,rct.left,eax,rect.right,edx,0
.endif
ret
WindowCenterProc endp
CalcXY proc cStart:DWORD,cEnd:DWORD,mStart:DWORD,mEnd:DWORD
mov eax,cStart
sub cEnd,eax
mov eax,mEnd
sub eax,mStart
push eax
sub eax,cEnd
.if SIGN?
neg eax
.endif
shr eax,1
pop edx
.if edx < cEnd
sub mStart,eax
.else
add mStart,eax
.endif
mov eax,mStart
mov edx,cEnd
ret
CalcXY endp
MoveXY proc wDim:DWORD,sDim:DWORD
shr sDim,1
shr wDim,1
mov eax,sDim
sub eax,wDim
ret
MoveXY endp
; 绘制窗口为位图形状
MakeRegion PROC uses esi edi ebx,hWin:DWORD,hBmp1:DWORD,hBmp2:DWORD
LOCAL hdc :DWORD
LOCAL hMemDC :DWORD
LOCAL tcol :DWORD
LOCAL CurRgn :DWORD,hBakBmp:DWORD
LOCAL TempRgn :DWORD
LOCAL rct :RECT
invoke GetWindowDC,hWin
mov hdc,eax
invoke CreateCompatibleDC,NULL
mov hMemDC,eax
invoke SelectObject,hMemDC,hBmp1
mov hBakBmp,eax
invoke GetClientRect,hWin,addr rct
xor esi,esi
xor edi,edi
invoke GetPixel,hMemDC,0,0
mov tcol,eax
invoke CreateRectRgn,0,0,rct.right,rct.bottom
mov CurRgn,eax
.while esi <= 5
.while edi <= 5
invoke GetPixel,hMemDC,edi,esi
.if eax == tcol
lea eax,[edi+1]
lea ecx,[esi+1]
invoke CreateRectRgn,edi,esi,eax,ecx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -