📄 bd.asm
字号:
.586
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \MASM32\INCLUDE\Comctl32.inc
include \MASM32\INCLUDE\comdlg32.inc
include \MASM32\include\oleaut32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
includelib \MASM32\LIB\comdlg32.lib
includelib \MASM32\LIB\Comctl32.lib
includelib \MASM32\LIB\oleaut32.lib
stralloc MACRO ln
invoke SysAllocStringByteLen,0,ln
ENDM
WM_SHELLNOTIFY equ WM_USER+5
IDI_TRAY equ 0
IDM_RESTORE equ 1000
IDM_ABOUT equ 1020
IDM_EXIT equ 1010
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
ClassName db "TrayIconWinClass",0
AppName db "日积月累记单词 v1.01",0
RestoreString db "设置",0
about_1 db "关于",0
ExitString db "退出",0
dir db "日积月累记单词 V1.0",0;
pars db "盛玉增版权所有",8 dup(0)
szNameFile db "danci.txt",0
OurText db "日积月累记单词 V1.0 作者:盛玉增 用汇编语言编制 2001.11.2",0
text1 db 200 dup (0)
text2 db 200 dup (0)
icon1 db "BOOK1.ICO",0
.data?
esi_1 dd ?
edx_1 dd ?
br dd ?
source$ dd ?
ln dd ?
hFile dd ?
hnd1 dd ?
hInstance dd ?
note NOTIFYICONDATA <>
hPopupMenu dd ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
;mov wc.hbrBackground,COLOR_APPWORKSPACE
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\
CW_USEDEFAULT,450,60,NULL,NULL,\
hInst,NULL
mov hwnd,eax
INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
INVOKE UpdateWindow, hwnd
.while TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL pt:POINT
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.if uMsg==WM_CREATE
invoke CreatePopupMenu
mov hPopupMenu,eax
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_ABOUT,addr about_1
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
invoke GetForegroundWindow
mov hnd1,eax
invoke GetWindowText,hnd1,ADDR text1,100
invoke CreateFile,ADDR szNameFile,
GENERIC_READ,
FILE_SHARE_READ,
NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
mov hFile, eax
invoke GetFileSize,hFile,NULL
mov ln, eax
stralloc ln
mov source$, eax
;mov esi_1,eax
invoke ReadFile,hFile,source$,ln,ADDR br,NULL
invoke CloseHandle,hFile
invoke SetTimer,hWnd,1,3000,NULL
.elseif uMsg==WM_DESTROY
invoke KillTimer,hWnd,1
invoke PostQuitMessage,NULL
.elseif uMsg == WM_TIMER
push esi
push edi
cld
invoke GetForegroundWindow
mov edx,hnd1
cmp eax,edx
jz st1_1
invoke SetWindowText,hnd1,ADDR text1
invoke GetForegroundWindow
mov hnd1,eax
invoke GetWindowText,hnd1,ADDR text1,100
;invoke MessageBox,hnd1,ADDR text1,ADDR dir,MB_OK
st1_1: mov edi,offset text2
rdtsc
add eax,100
mov ecx,ln
st1_1_1:cmp eax,ecx
jb st1_1_2
sub eax,ecx
jmp st1_1_1
st1_1_2:
mov esi,source$
add esi,eax
mov esi_1,esi
mov edx,source$
mov ecx,ln
add edx,ecx
mov edx_1,edx
cmp esi,edx
jnb st1_1
st1_2:
lodsb
cmp al,0dh
jz st1_2_1
cmp esi,edx
jnb st1_1
jmp st1_2
st1_2_1:
lodsb
cmp al,0ah
jz st1_2_2
jmp st1_1
st1_2_2:
cmp esi,edx
jnb st1_1
st1_2_3:lodsb
cmp al,0dh
jz st1_3
stosb
cmp esi,edx
jnb st1_1
jmp st1_2_3
st1_3:
mov al,0
stosb
;;;;;;;;;;
invoke SetWindowText,hnd1,ADDR text2
jmp nx_1_1
end_1:
jmp st1_1
nx_1_1:pop edi
pop esi
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd, ADDR ps
.elseif uMsg==WM_SIZE
.if wParam==SIZE_MINIMIZED
mov note.cbSize,sizeof NOTIFYICONDATA
push hWnd
pop note.hwnd
mov note.uID,IDI_TRAY
mov note.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP
mov note.uCallbackMessage,WM_SHELLNOTIFY
invoke LoadIcon,NULL,IDI_ASTERISK
mov note.hIcon,eax
invoke lstrcpy,addr note.szTip,addr AppName
invoke ShowWindow,hWnd,SW_HIDE
invoke Shell_NotifyIcon,NIM_ADD,addr note
.endif
.elseif uMsg==WM_COMMAND
.if lParam==0
invoke Shell_NotifyIcon,NIM_DELETE,addr note
mov eax,wParam
.if ax==IDM_RESTORE
invoke ShowWindow,hWnd,SW_RESTORE
.elseif ax==IDM_ABOUT
invoke MessageBox,hnd1,ADDR OurText,ADDR dir,MB_OK
invoke ShowWindow,hWnd,SW_RESTORE
.else
invoke DestroyWindow,hWnd
.endif
.endif
.elseif uMsg==WM_SHELLNOTIFY
.if wParam==IDI_TRAY
.if lParam==WM_RBUTTONDOWN
invoke GetCursorPos,addr pt
invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL
.elseif lParam==WM_LBUTTONDBLCLK
invoke SendMessage,hWnd,WM_COMMAND,IDM_RESTORE,0
.endif
.endif
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -