[CM]James17 |
Дата: Суббота, 18.04.2020, 21:37 | Сообщение # 2
|
Новичок
Сообщений: 22
Статус: Offline
|
Поконкретнее, пожалуйста. Какой из способов именно Вам нужен? Это единственная функция скрипта или лишь его часть?(остальная часть взаимодействует с UDF)
Добавлено (18.04.2020, 21:44) --------------------------------------------- Подключать огромный UDF нет смысла, если Вас интересует только одна простая задача, поэтому вот с вырезанными функциями, ведь это, так или иначе, работает лучше.
Код #NoTrayIcon global hGTA := 0x0 global dwSAMP := 0x0 global ADDR_SAMP_CHATMSG_PTR := 0x21a0e4 global ERROR_OK := 0 global ERROR_OPEN_PROCESS := 2 global ERROR_INVALID_HANDLE := 3 global ERROR_MODULE_NOT_FOUND := 4 global ERROR_ENUM_PROCESS_MODULES := 5 global ERROR_READ_MEMORY := 8 global ERROR_WRITE_MEMORY := 9 global ERROR_ALLOC_MEMORY := 10 global ERROR_FREE_MEMORY := 11 global ERROR_WAIT_FOR_OBJECT := 12 global ERROR_CREATE_THREAD := 13 global iRefreshScoreboard := 0 global oScoreboardData := "" global iRefreshHandles := 0
F2:: while !(getChatLineEx() contains ТУТ ИСКОМАЯ СТРОКА) { continue } sleep 200 SendInput {F6}Ваш текст{Enter} return
getChatLineEx(line := 0) { if(!checkHandles()) return dwPtr := dwSAMP + ADDR_SAMP_CHATMSG_PTR dwAddress := readDWORD(hGTA, dwPtr) if(ErrorLevel) return msg := readString(hGTA, dwAddress + 0x152 + ( (99-line) * 0xFC), 0xFC) if(ErrorLevel) return return msg }
openProcess(dwPID, dwRights = 0x1F0FFF) { hProcess := DllCall("OpenProcess" , "UInt", dwRights , "int", 0 , "UInt", dwPID , "Uint") if(hProcess == 0) { ErrorLevel := ERROR_OPEN_PROCESS return 0 } ErrorLevel := ERROR_OK return hProcess } getModuleBaseAddress(sModule, hProcess) { if(!sModule) { ErrorLevel := ERROR_MODULE_NOT_FOUND return 0 } if(!hProcess) { ErrorLevel := ERROR_INVALID_HANDLE return 0 } dwSize = 1024*4 VarSetCapacity(hMods, dwSize) VarSetCapacity(cbNeeded, 4) dwRet := DllCall( "Psapi.dll\EnumProcessModules" , "UInt", hProcess , "UInt", &hMods , "UInt", dwSize , "UInt*", cbNeeded , "UInt") if(dwRet == 0) { ErrorLevel := ERROR_ENUM_PROCESS_MODULES return 0 } dwMods := cbNeeded / 4 i := 0 VarSetCapacity(hModule, 4) VarSetCapacity(sCurModule, 260) while(i < dwMods) { hModule := NumGet(hMods, i*4) DllCall("Psapi.dll\GetModuleFileNameEx" , "UInt", hProcess , "UInt", hModule , "Str", sCurModule , "UInt", 260) SplitPath, sCurModule, sFilename if(sModule == sFilename) { ErrorLevel := ERROR_OK return hModule } i := i + 1 } ErrorLevel := ERROR_MODULE_NOT_FOUND return 0 } virtualAllocEx(hProcess, dwSize, flAllocationType, flProtect) { if(!hProcess) { ErrorLevel := ERROR_INVALID_HANDLE return 0 } dwRet := DllCall( "VirtualAllocEx" , "UInt", hProcess , "UInt", 0 , "UInt", dwSize , "UInt", flAllocationType , "UInt", flProtect , "UInt") if(dwRet == 0) { ErrorLEvel := ERROR_ALLOC_MEMORY return 0 } ErrorLevel := ERROR_OK return dwRet } closeProcess(hProcess) { if(hProcess == 0) { ErrorLevel := ERROR_INVALID_HANDLE return 0 } dwRet := DllCall( "CloseHandle" , "Uint", hProcess , "UInt") ErrorLevel := ERROR_OK } __ansiToUnicode(sString, nLen = 0) { If !nLen { nLen := DllCall("MultiByteToWideChar" , "Uint", 0 , "Uint", 0 , "Uint", &sString , "int", -1 , "Uint", 0 , "int", 0) }
VarSetCapacity(wString, nLen * 2)
DllCall("MultiByteToWideChar" , "Uint", 0 , "Uint", 0 , "Uint", &sString , "int", -1 , "Uint", &wString , "int", nLen) return wString } getPID(szWindow) { local dwPID := 0 WinGet, dwPID, PID, %szWindow% return dwPID } virtualFreeEx(hProcess, lpAddress, dwSize, dwFreeType) { if(!hProcess) { ErrorLevel := ERROR_INVALID_HANDLE return 0 } dwRet := DllCall( "VirtualFreeEx" , "UInt", hProcess , "UInt", lpAddress , "UInt", dwSize , "UInt", dwFreeType , "UInt") if(dwRet == 0) { ErrorLEvel := ERROR_FREE_MEMORY return 0 } ErrorLevel := ERROR_OK return dwRet } readString(hProcess, dwAddress, dwLen) { if(!hProcess) { ErrorLevel := ERROR_INVALID_HANDLE return 0 } VarSetCapacity(sRead, dwLen) dwRet := DllCall( "ReadProcessMemory" , "UInt", hProcess , "UInt", dwAddress , "Str", sRead , "UInt", dwLen , "UInt*", 0 , "UInt") if(dwRet == 0) { ErrorLevel := ERROR_READ_MEMORY return 0 } ErrorLevel := ERROR_OK if A_IsUnicode return __ansiToUnicode(sRead) return sRead } readDWORD(hProcess, dwAddress) { if(!hProcess) { ErrorLevel := ERROR_INVALID_HANDLE return 0 } VarSetCapacity(dwRead, 4) dwRet := DllCall( "ReadProcessMemory" , "UInt", hProcess , "UInt", dwAddress , "Str", dwRead , "UInt", 4 , "UInt*", 0) if(dwRet == 0) { ErrorLevel := ERROR_READ_MEMORY return 0 } ErrorLevel := ERROR_OK return NumGet(dwRead, 0, "UInt") } checkHandles() { if(iRefreshHandles+500>A_TickCount) return true iRefreshHandles:=A_TickCount if(!refreshGTA() || !refreshSAMP() || !refreshMemory()) { return false } else { return true } return true } refreshGTA() { newPID := getPID("GTA:SA:MP") if(!newPID) { if(hGTA) { virtualFreeEx(hGTA, pMemory, 0, 0x8000) closeProcess(hGTA) hGTA := 0x0 } dwGTAPID := 0 hGTA := 0x0 dwSAMP := 0x0 pMemory := 0x0 return false } if(!hGTA || (dwGTAPID != newPID)) { hGTA := openProcess(newPID) if(ErrorLevel) { dwGTAPID := 0 hGTA := 0x0 dwSAMP := 0x0 pMemory := 0x0 return false } dwGTAPID := newPID dwSAMP := 0x0 pMemory := 0x0 return true } return true } refreshSAMP() { if(dwSAMP) return true dwSAMP := getModuleBaseAddress("samp.dll", hGTA) if(!dwSAMP) return false return true } refreshMemory() { if(!pMemory) { pMemory := virtualAllocEx(hGTA, 6144, 0x1000 | 0x2000, 0x40) if(ErrorLevel) { pMemory := 0x0 return false } pParam1 := pMemory pParam2 := pMemory + 1024 pParam3 := pMemory + 2048 pParam4 := pMemory + 3072 pParam5 := pMemory + 4096 pInjectFunc := pMemory + 5120 } return true } readMem(hProcess, dwAddress, dwLen=4, type="UInt") { if(!hProcess) { ErrorLevel := ERROR_INVALID_HANDLE return 0 } VarSetCapacity(dwRead, dwLen) dwRet := DllCall( "ReadProcessMemory" , "UInt", hProcess , "UInt", dwAddress , "Str", dwRead , "UInt", dwLen , "UInt*", 0) if(dwRet == 0) { ErrorLevel := ERROR_READ_MEMORY return 0 } ErrorLevel := ERROR_OK return NumGet(dwRead, 0, type) } P.S. Тут, кстати, SendChat отсутствует. По надобности добавьте.
Сообщение отредактировал [CM]James17 - Суббота, 18.04.2020, 21:49 |
|
|
|
[CM]James17 |
Дата: Пятница, 24.04.2020, 10:04 | Сообщение # 5
|
Новичок
Сообщений: 22
Статус: Offline
|
Цитата CZAR ( ) [CM]James17, ну ты же понимаешь, что это тупо? + Когда ты читаешь только последнюю строку, скрипт может пропустить строки, если будут флудить или еще что-то. Это лишь набросок, чтобы дать основу для скрипта, который я вытащил из автологина. Работу с массивами и проверку сразу нескольких строк никто не отменял. И нет, это не тупо. UDF и чтение памяти - всяко лучше идиотской проверки по размеру .txt файла с его удалением и созданием, как делали года 3 назад, если не больше.
Добавлено (24.04.2020, 10:05) ---------------------------------------------
Цитата [CM () James17;4696379]А скрипт бесконечный? Нет, после выполнения скрипта требуется его повторный запуск.
Сообщение отредактировал [CM]James17 - Пятница, 24.04.2020, 10:10 |
|
|
|
[CM]James17 |
Дата: Четверг, 30.04.2020, 19:24 | Сообщение # 7
|
Новичок
Сообщений: 22
Статус: Offline
|
Цитата CZAR ( ) Можно и без удаления и создания. Скилзов у кого-то мало) Хех, безусловно, можно. Не раз приходилось работать с чатом, и не одним, и не десятью способами, как собственными функциями, так и UDF. Критика это, конечно хорошо. Только вот, наверное, мне куда удобнее вырезать уже готовый код с прекрасно работающим функционалом, нежели заново писать его, когда "проходил" мимо темы и решил откликнуться. Можете просто предложить свою альтернативу автору темы.
Сообщение отредактировал [CM]James17 - Четверг, 30.04.2020, 19:25 |
|
|
|