Тема: AHK: Тип данных
Добрый день уважаемые форумчане. Столкнулся вот с какой проблемой. Есть бот, в нем есть функция по считыванию данных адреса. Все прекрасно работает, но недавно добави новый "Контроллер", значение этого адреса идет по типу Float, раньше все было по типу 4 bytes. Суть такова что идет считывание базового адреса и к нему прибавляется смещение, получается исходный адрес. Но к сожалению с адресом типа Float программа работать не хочет, заходит в цикл но не полностью, и выходит из него, если объект (в данном случае питомец) не используется (неактивен). Если же объект активен, то чтение не происходит и цикл вообще не используется.
Для примера выложу цикл с 4 bytes (рабочий) и с Float (нерабочий)
Это так называемый базовый адрес:
ReadSize = 4
VarSetCapacity(Buf, ReadSize, 0)
PROCESS_VM_READ = 0x10
Process, Exist, %ProcessName%
PID := ProcessPID
hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
, Int, False
, UInt, PID)
Ret := DllCall("ReadProcessMemory", UInt, hProcess
, UInt, base
, UInt, &Buf
, UInt, ReadSize
, UInt, 0)
DllCall("CloseHandle", UInt, hProcess)
pointer := NumGet(Buf)Рабочий цикл (4 bytes)
if (a32<1)
{
VarSetCapacity(Buf, ReadSize, 0)
PROCESS_VM_READ = 0x10
Process, Exist, %ProcessName%
PID := ProcessPID
hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
, Int, False
, UInt, PID)
Ret := DllCall("ReadProcessMemory", UInt, hProcess
, UInt, pointer + hpgom
, UInt, &Buf
, UInt, ReadSize
, UInt, 0)
DllCall("CloseHandle", UInt, hProcess)
gomoz := NumGet(Buf)
If (gomoz < gomhp)
{
Sleep, 2000
SetKeyDelay, 1
ControlSend,, {LAlt down}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep,30
ControlSend,, {2}, ahk_pid %ProcessPID%
Sleep,30
ControlSend,, {LAlt up}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep,300
SetKeyDelay, 1
ControlSend,, {F11}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 1000
SetKeyDelay, 1
ControlSend,, {F11}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 1000
SetKeyDelay, 1
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1
ControlSend,, {F1}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 1000
ControlSend,, {Tab}, ahk_pid %ProcessPID%
SetKeyDelay, 1
ControlSend,, {LAlt down}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep,30
ControlSend,, {1}, ahk_pid %ProcessPID%
Sleep,30
ControlSend,, {LAlt up}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep,300
}
a32:=3
}
a32:=a32-1Нерабочий цикл (Float)
if (a35<1)
{
VarSetCapacity(Buf, ReadSize, 0)
PROCESS_VM_READ = 0x10
Process, Exist, %ProcessName%
PID := ProcessPID
hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
, Int, False
, UInt, PID)
Ret := DllCall("ReadProcessMemory", UInt, hProcess
, UInt, pointer + hppet
, UInt, &Buf
, UInt, ReadSize
, UInt, 0)
DllCall("CloseHandle", UInt, hProcess)
petoz := NumGet(Buf)
If (petoz < pethp)
{
Sleep, 2000
SetKeyDelay, 1
ControlSend,, {LAlt down}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep,30
ControlSend,, {2}, ahk_pid %ProcessPID%
Sleep,30
ControlSend,, {LAlt up}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep,300
SetKeyDelay, 1
ControlSend,, {F12}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 1000
SetKeyDelay, 1
ControlSend,, {F12}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 1000
SetKeyDelay, 1
ControlSend,, {F4}, ahk_pid %ProcessPID%
SetKeyDelay, 1
ControlSend,, {F4}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep, 1000
ControlSend,, {Tab}, ahk_pid %ProcessPID%
SetKeyDelay, 1
ControlSend,, {LAlt down}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep,30
ControlSend,, {1}, ahk_pid %ProcessPID%
Sleep,30
ControlSend,, {LAlt up}, ahk_pid %ProcessPID%
SetKeyDelay, 1
Sleep,300
}
a35:=3
}
a35:=a35-1Первый цикл работает, и при неактивности объекта программа не пытается зайти в цикл. А вот второй цикл начинает чудить. Вроде ошибок в коде нет, синтаксис правильный. В чем проблема я не могу понять. Может кто знает в чем проблема, или я что то где то упустил.
Версия AHK - 1.0.48.05

