;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 判断游戏进程是否存在
; 返回值:
; eax = TRUE,存在
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IsExistGameProcess proc uses edx esi edi ecx
local _exitCde:DWORD
invoke GetExitCodeProcess, g_ZTProcess, addr _exitCde
test eax, eax
jz _process_not_exist
cmp _exitCde,STILL_ACTIVE
jne _process_not_exist
mov eax, TRUE
ret
_process_not_exist:
xor eax, eax
ret
IsExistGameProcess endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 枚举窗口
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EnumWindowProc proc hWnd:DWORD, lParam:DWORD
local _buffer[255]:byte
local _pid:DWORD
mov _pid, NULL
invoke GetWindowText, hWnd, addr _buffer,255
test eax, eax
jz _next_window
; invoke IsWindowVisible, hWnd
; test eax, eax
; jz _next_window
invoke GetWindowThreadProcessId, hWnd, addr _pid
mov eax, _pid
cmp eax, g_ZTCurPID
jne _next_window
push hWnd
pop g_ZTCurWnd
mov eax, FALSE
ret
_next_window:
mov eax, TRUE
ret
EnumWindowProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 显示托盘图标信息 timer过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ShowTrayTimerProc proc hWnd:DWORD, uMsg:DWORD, idEvent:DWORD, dwTimer:DWORD
LOCAL _buf[255]:byte
pushad
invoke IsDlgButtonChecked, g_MainWnd, IDC_CHECK_CLOSE_TRAYINFO
cmp eax, BST_CHECKED
je _exit_timer_proc
invoke RtlZeroMemory, addr _buf, 255
invoke GetWindowLong, g_MainWnd, GWL_STYLE
and eax, WS_MINIMIZE
JNZ _show_notifyicon
and eax, WS_VISIBLE
JZ _show_notifyicon
jmp _exit_timer_proc
_show_notifyicon:
mov g_stNIF.dwInfoFlags, NIIF_INFO
mov g_stNIF.uTimeout, 3000
invoke lstrcpy, addr g_stNIF.szTip, addr g_SelfName
;'%s', 0DH, 0AH, '经验:%ld/%ld', 0DH, 0AH, '生命:%ld/%ld', 0DH, 0AH, '法力:%ld/%ld', 0DH, 0AH,'位置:%s', 0DH,0AH '坐标:(%ld,%ld)',0
invoke wsprintf, addr _buf, addr g_ShowTrayInfo, \
addr g_SelfName, DWORD ptr g_SelfCurExp, DWORD ptr g_SelfMaxExp, \
g_SelfCurLife, g_SelfMaxLife, g_SelfCurMagic, g_SelfMaxMagic, \
addr g_SelfMapName, g_SelfPosX, g_SelfPosY, g_ExpSpeed, g_ExpUpdateTimeI, \
g_ExpUpdateTimeF, addr g_ObjectName
invoke lstrcpy, addr g_stNIF.szInfo, addr _buf
;invoke ShowWindow, g_MainWnd, SW_HIDE
.if lpShell_NotifyIcon != NULL
invoke lpShell_NotifyIcon, NIM_MODIFY, addr g_stNIF
.endif
_exit_timer_proc:
popad
ret
ShowTrayTimerProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自动捡起垃圾过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
PickupTimerProc proc hWnd:DWORD, uMsg:DWORD, idEvent:DWORD, dwTimer:DWORD
pushad
cmp g_AutoPickupState, TRUE
jne _exit_pickup_time_proc
invoke GetForegroundWindow
cmp eax, g_ZTCurWnd
jne _exit_pickup_time_proc
invoke PostMessage, g_ZTCurWnd, WM_KEYDOWN, 0C0H, 0
invoke Sleep, 100
invoke PostMessage, g_ZTCurWnd, WM_KEYUP, 0C0H, 0
_exit_pickup_time_proc:
popad
ret
PickupTimerProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DialogProc proc uses ebx edi esi hWnd:DWORD, wMsg:DWORD, wParam:DWORD, lParam:DWORD
local _stPS:PAINTSTRUCT
local _stPT:POINT
local _curExp:DWORD, _maxExp:DWORD
mov eax,wMsg
; 窗体刷新
;********************************************************************
.if eax == WM_PAINT
invoke BeginPaint, hWnd, addr _stPS
invoke CreateBarGround, IDC_STATIC_LIFE_BAR
invoke DrawBar, g_SelfCurLife, g_SelfMaxLife, IDC_STATIC_LIFE_BAR, BMP_LIFE
invoke CreateBarGround, IDC_STATIC_MAGIC_BAR
invoke DrawBar, g_SelfCurMagic, g_SelfMaxMagic, IDC_STATIC_MAGIC_BAR, BMP_MAGIC
mov eax, DWORD ptr g_SelfCurExp
mov _curExp, eax
mov eax, DWORD ptr g_SelfMaxExp
mov _maxExp, eax
invoke CreateBarGround, IDC_STATIC_EXP_BAR
invoke DrawBar, _curExp, _maxExp, IDC_STATIC_EXP_BAR, BMP_EXP
invoke EndPaint, hWnd, addr _stPS
; 按钮菜单等相关操作
;********************************************************************
.elseif eax == WM_COMMAND
mov eax, wParam
; 启动按钮
;********************************************************************
.if ax == IDC_BUTTON_APPLY
.if g_HelpStop
; 创建信息获取线程
;********************************************************************
invoke InitEventQueue, offset g_EvtQueue
mov g_SkillAssoilState, 00000000H
mov g_HelpStop, FALSE
invoke CreateThread, NULL, 0, addr ShowInfoThreadProc, NULL, NULL, NULL
.if eax
invoke CloseHandle, eax
invoke GetDlgItem, g_MainWnd, IDC_BUTTON_APPLY
invoke SetWindowText, eax, _T('停止(&S)')
invoke GetDlgItem, g_MainWnd, IDC_BUTTON_SEARCH
invoke EnableWindow, eax, FALSE
invoke CreateThread, NULL, 0, addr HelpThreadProc, NULL, NULL, NULL
.if eax
invoke CloseHandle, eax
.endif
invoke CreateThread, NULL, 0, addr EventThreadProc, NULL, NULL, NULL
.if eax
invoke CloseHandle, eax
.endif
invoke SetTimer, g_MainWnd, IDI_PICKUP_TIME, 3000, addr PickupTimerProc
.else
invoke GetDlgItem, g_MainWnd, IDC_BUTTON_APPLY
invoke EnableWindow, eax, FALSE
.endif
.else
mov g_HelpStop, TRUE
invoke GetDlgItem, g_MainWnd, IDC_BUTTON_APPLY
invoke SetWindowText, eax, _T('启动(&P)')
invoke GetDlgItem, g_MainWnd, IDC_BUTTON_SEARCH
invoke EnableWindow, eax, TRUE
.endif
; 退出按钮
;********************************************************************
.elseif ax == IDC_BUTTON_EXIT
jmp _close_main
; 隐藏游戏复选框
;********************************************************************
.elseif ax == IDC_CHECK_HIDE_GAME_WINDOW
_show_or_hide_game:
invoke IsDlgButtonChecked, hWnd, IDC_CHECK_HIDE_GAME_WINDOW
.if eax == BST_CHECKED
invoke IsWindowVisible, g_ZTCurWnd
.if eax
invoke ShowWindow, g_ZTCurWnd, SW_HIDE
invoke CheckMenuRadioItem, g_PopupMenu, ID_POPUP_ITEM_SHOW_GAME,\
ID_POPUP_ITEM_HIDE_GAME, ID_POPUP_ITEM_HIDE_GAME, MF_BYCOMMAND
.endif
.elseif eax == BST_UNCHECKED
invoke IsWindowVisible, g_ZTCurWnd
.if !eax
invoke ShowWindow, g_ZTCurWnd, SW_SHOW
invoke CheckMenuRadioItem, g_PopupMenu, ID_POPUP_ITEM_SHOW_GAME,\
ID_POPUP_ITEM_HIDE_GAME, ID_POPUP_ITEM_SHOW_GAME, MF_BYCOMMAND
.endif
.endif
; 仙挂机辅助复选框
;********************************************************************
.elseif ax == IDC_CHECK_XIAN_HELPER
invoke IsDlgButtonChecked, hWnd, IDC_CHECK_XIAN_HELPER
.if eax == BST_UNCHECKED
mov g_SSAssoiled, FALSE
mov g_ZSAssoiled, FALSE
mov g_SS_sTime, 0
mov g_ZS_sTime, 0
.endif
; 本窗体最前复选框
;********************************************************************
.elseif ax == IDC_CHECK_SELF_SETTOP
invoke IsDlgButtonChecked, hWnd, IDC_CHECK_SELF_SETTOP
.if eax == BST_CHECKED
invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, \
SWP_NOMOVE or SWP_NOSIZE
.elseif eax == BST_UNCHECKED
invoke SetWindowPos, hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, \
SWP_NOMOVE or SWP_NOSIZE
.endif
; 自动释放技能复选框
;********************************************************************
.elseif ax == IDC_CHECK_AUTO_SKILL_1
invoke IsDlgButtonChecked, hWnd, IDC_CHECK_AUTO_SKILL_1
.if eax == BST_UNCHECKED
mov g_Skill_Interval_1, 0
mov g_Skill_Assoil_1, FALSE
invoke SendDlgItemMessage, g_MainWnd, IDC_STATIC_AUTO_SKILL_TIME_1, \
WM_SETTEXT, 0, _T("0")
.endif
.elseif ax == IDC_CHECK_AUTO_SKILL_2
invoke IsDlgButtonChecked, hWnd, IDC_CHECK_AUTO_SKILL_2
.if eax == BST_UNCHECKED
mov g_Skill_Interval_2, 0
mov g_Skill_Assoil_2, FALSE
invoke SendDlgItemMessage, g_MainWnd, IDC_STATIC_AUTO_SKILL_TIME_2, \
WM_SETTEXT, 0, _T("0")
.endif
.elseif ax == IDC_CHECK_AUTO_SKILL_3
invoke IsDlgButtonChecked, hWnd, IDC_CHECK_AUTO_SKILL_3
.if eax == BST_UNCHECKED
mov g_Skill_Interval_3, 0
mov g_Skill_Assoil_3, FALSE
invoke SendDlgItemMessage, g_MainWnd, IDC_STATIC_AUTO_SKILL_TIME_3, \
WM_SETTEXT, 0, _T("0")
.endif
.elseif ax == IDC_CHECK_AUTO_SKILL_4
invoke IsDlgButtonChecked, hWnd, IDC_CHECK_AUTO_SKILL_4
.if eax == BST_UNCHECKED
mov g_Skill_Interval_4, 0
mov g_Skill_Assoil_4, FALSE
invoke SendDlgItemMessage, g_MainWnd, IDC_STATIC_AUTO_SKILL_TIME_4, \
WM_SETTEXT, 0, _T("0")
.endif
; ; 关闭托盘信息显示复选框
; ;********************************************************************
; .elseif ax == IDC_CHECK_CLOSE_TRAYINFO
; invoke IsDlgButtonChecked, hWnd, IDC_CHECK_CLOSE_TRAYINFO
; .if eax == BST_CHECKED
; .if g_Timer
; invoke KillTimer, g_MainWnd, IDI_SHOWTRAYINFO_TIME
; mov g_Timer, 0
; .endif
; .endif
; 显示主窗体弹出菜单项
;********************************************************************
.elseif ax == ID_POPUP_ITEM_SHOW_MAIN
invoke SendMessage, hWnd, WM_SIZE, SIZE_RESTORED, 0
; 显示游戏窗体弹出菜单项
;********************************************************************
.elseif ax == ID_POPUP_ITEM_SHOW_GAME
invoke SendDlgItemMessage, hWnd, IDC_CHECK_HIDE_GAME_WINDOW, \
BM_SETCHECK, BST_UNCHECKED, 0
jmp _show_or_hide_game
; 隐藏游戏窗体弹出菜单项
;********************************************************************
.elseif ax == ID_POPUP_ITEM_HIDE_GAME
invoke SendDlgItemMessage, hWnd, IDC_CHECK_HIDE_GAME_WINDOW, \
BM_SETCHECK, BST_CHECKED, 0
jmp _show_or_hide_game
; 自动捡取垃圾弹出菜单项
;********************************************************************
.elseif ax == ID_POPUP_ITEM_AUTO_PICKUP
invoke GetMenuState, g_PopupMenu, ID_POPUP_ITEM_AUTO_PICKUP, \
MF_BYCOMMAND
.if eax == MF_UNCHECKED
mov g_AutoPickupState, TRUE
mov eax, MF_CHECKED
.else
mov g_AutoPickupState, FALSE
mov eax, MF_UNCHECKED
.endif
invoke CheckMenuItem, g_PopupMenu, ID_POPUP_ITEM_AUTO_PICKUP, eax
; 退出本工具弹出菜单项
;********************************************************************
.elseif ax == ID_POPUP_ITEM_EXIT_APP
jmp _close_main
.endif
; 托盘图标
;********************************************************************
.elseif eax == WM_SHELLNOTIFY
.if lParam == WM_LBUTTONDBLCLK
invoke SendMessage, hWnd, WM_SIZE, SIZE_RESTORED, 0
.elseif lParam == WM_RBUTTONDOWN
invoke GetCursorPos,addr _stPT
invoke TrackPopupMenu, g_PopupMenu, TPM_RIGHTALIGN, _stPT.x, _stPT.y, NULL, hWnd, NULL
.endif
; 窗体形态发生改变
;********************************************************************
.elseif eax == WM_SIZE
.if wParam == SIZE_MINIMIZED
invoke IsDlgButtonChecked, hWnd, IDC_CHECK_SYS_NOTIFY
.if eax == BST_CHECKED
mov g_stNIF.dwInfoFlags, NIIF_WARNING
mov g_stNIF.uTimeout, 0BB8H
invoke lstrcpy, addr g_stNIF.szTip, addr g_SelfName
;invoke lstrcpy, addr g_stNIF.szInfo, _T('我现在在这里了!')
invoke ShowWindow, hWnd, SW_HIDE
.if lpShell_NotifyIcon != NULL
invoke lpShell_NotifyIcon, NIM_ADD, addr g_stNIF
.endif
; invoke SetTimer,hWnd, IDI_SHOWTRAYINFO_TIME, 10000, addr ShowTrayTimerProc
; mov g_Timer, eax
.endif
.elseif wParam == SIZE_RESTORED
invoke ShowWindow, hWnd, SW_RESTORE
.if lpShell_NotifyIcon != NULL
invoke lpShell_NotifyIcon, NIM_DELETE, addr g_stNIF
.endif
.if g_Timer
; invoke KillTimer, g_MainWnd, IDI_SHOWTRAYINFO_TIME
; mov g_Timer, 0
.endif
.endif
; 辅助工具初始化
;********************************************************************
.elseif eax == WM_INITDIALOG
push hWnd
pop g_MainWnd
mov g_AutoPickupState, FALSE
invoke CreatePopupMenu
mov g_PopupMenu,eax
invoke AppendMenu, g_PopupMenu, MF_STRING or MF_DEFAULT,ID_POPUP_ITEM_SHOW_MAIN, addr g_PITEM_SM
invoke AppendMenu, g_PopupMenu, MF_SEPARATOR, 0, NULL
invoke AppendMenu, g_PopupMenu, MF_STRING, ID_POPUP_ITEM_SHOW_GAME, addr g_PITEM_SG
invoke AppendMenu, g_PopupMenu, MF_STRING, ID_POPUP_ITEM_HIDE_GAME, addr g_PITEM_HG
invoke AppendMenu, g_PopupMenu, MF_SEPARATOR, 0, NULL
invoke AppendMenu, g_PopupMenu, MF_STRING, ID_POPUP_ITEM_AUTO_PICKUP, addr g_PITEM_AP
invoke AppendMenu, g_PopupMenu, MF_SEPARATOR, 0, NULL
invoke AppendMenu, g_PopupMenu, MF_STRING, ID_POPUP_ITEM_EXIT_APP, addr g_PITEM_EA
; 提升进程本身权限
;********************************************************************
invoke _EnablePrivilege, offset mySE_DEBUG_NAME, TRUE
;托盘
;********************************************************************
invoke LoadLibrary, _T('shell32.dll')
.if eax
mov g_lpShellNotifyDll, eax
invoke GetProcAddress, g_lpShellNotifyDll, \
_T('Shell_NotifyIcon')
mov lpShell_NotifyIcon, eax
.endif
invoke LoadLibrary, _T('MyGetKeyState.dll')
.if eax
mov g_lpInstallApiHookDll, eax
invoke GetProcAddress, g_lpInstallApiHookDll, \
_T('InstallMyKeyMouseApiHook')
mov lpInstallApiHook, eax
invoke GetProcAddress, g_lpInstallApiHookDll, \
_T('SetKeyData')
mov lpSetKeyData, eax
.endif
invoke RtlZeroMemory, addr g_stNIF, sizeof NEWNOTIFYICONDATA
mov g_stNIF.cbSize, sizeof NEWNOTIFYICONDATA
push hWnd
pop g_stNIF.hWnd
;mov g_stNIF.uID, IDI_TRAY
mov g_stNIF.uFlags, NIF_ICON + NIF_MESSAGE + NIF_TIP + NIF_INFO
mov g_stNIF.uCallbackMessage, WM_SHELLNOTIFY
invoke LoadIcon, g_InstanceHandle, ICO_MAIN
mov g_stNIF.hIcon, eax
mov g_stNIF.dwInfoFlags, NIIF_WARNING
invoke lstrcpy, addr g_stNIF.szInfoTitle, _T('Journey Helper')
;invoke lpShell_NotifyIcon, NIM_ADD, addr g_stNIF
; 创建状态栏
;********************************************************************
call CreateStatusBar
call ReSize
; 初始化快捷键列表
;********************************************************************
call InitKeyList
; 窗体是否最前
;********************************************************************
invoke IsDlgButtonChecked, hWnd, IDC_CHECK_SELF_SETTOP
.if eax == BST_CHECKED
invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, \
SWP_NOMOVE or SWP_NOSIZE
.elseif eax == BST_UNCHECKED
invoke SetWindowPos, hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, \
SWP_NOMOVE or SWP_NOSIZE
.endif
; 设置标题栏图标
;********************************************************************
invoke LoadIcon, g_InstanceHandle, ICO_MAIN
invoke SendMessage, hWnd, WM_SETICON, ICON_BIG, eax
; 搜索进程
;********************************************************************
invoke SearchGameProcess, addr g_ZTProcessName, addr g_PidFilter
.if g_ZTCurPID != 0
; 如果找到了进程,则对其进行操作
;********************************************************************
invoke OpenProcess, PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or \
PROCESS_TERMINATE, FALSE, g_ZTCurPID
test eax, eax
jz _error_ret
mov g_ZTProcess, eax
; 从基地址获取相关地址
;********************************************************************
call GetSelfAddr
.if !eax
invoke GetDlgItem, g_MainWnd, IDC_BUTTON_APPLY
invoke EnableWindow, eax, FALSE
jz _error_ret
.endif
call GetObjectAddr
.if !eax
invoke