Надоело это радио, а если в настройках отключить звук радио, то не будет играть музыка из /fm Скрипт состоит из 5 функций для чтения памяти игры и одного цикла, всего 140 строк кода У каждой радиостанции в GTA есть свой ID, а вот когда радио отключено - её ID 13 Так вот, этот скрипт листает радио пока не достигнет ID 13 Думаю я доходчиво объяснил Самое главное, это кнопка переключения радио. У меня это R и 4. По этому как видно в коде ниже у меня Send, {R} (См. в конце кода) Если у вас не на R и 4, вы легко можете поменять сами. Ну или написать мне в Личные Сообщения. FAQ по AHK: https://forum.gtarp.ru/threads/faq-ahk-autohotkey.92608/ Cкачать скрипт можно по ссылке: https://yadi.sk/d/UlCFtCth3Ltreb Выкладываю код скрипта в тему. Использую AutoHotKey 1.1.25.02 Спойлер: Код Код: global newPID := getPID("grand_theft_auto_san_andreas.dll") global hGTA := openProcess(newPID) getPID(sProcess) { Process, Exist, %sProcess% dwPID = %ErrorLevel% if(dwPID == 0) { ErrorLevel := ERROR_PROCESS_NOT_FOUND return 0 } ErrorLevel := ERROR_OK return dwPID } 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 } 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) } 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") } Loop { IfWinActive Criminal Russia Multiplayer Ревизия G { isPlayerInAnyVehicle := readDWORD(hGTA, 0xBA18FC) if (isPlayerInAnyVehicle != 0) { dwGTA := getModuleBaseAddress("grand_theft_auto_san_andreas.dll", hGTA) RadioStationID := readMem(hGTA, dwGTA + 0x4CB7E1, 1, "byte") IsInMenu := readMem(hGTA, 0xBA67A4, 4, "byte") if (IsInMenu == 1) continue if (RadioStationID == 13) continue if (RadioStationID != 13) { SetKeyDelay, 1, 1 Send, {R} continue } } } }