Что нового

Как сделать запись значения в память процесса с текстовым полем "Input"?

Raz

Новичок
Сообщения
2
Репутация
0
Как сделать запись значения в память процесса при введении желаемого значения по одному из 135 текстовых полей "Input"? Есть код, который считывает значения в 135 "Input" с таймером, раз в секунду. Нужно чтоб в любом текст. поле "Input" при нажатии кнопок на клавиатуре (OnKeyPress) таймер останавливался, чтоб можно было менять значение и при вводе в "Input" желаемого значения и нажатии кнопки 'Enter' делать запись в память по определенному адресу.
Второй воррос: Какие еще есть события, в контроле "Input", кроме OnChange, что бы остановить таймер? При считывании из памяти, в текстовом поле нельзя изменить значение, потому что значение обновляется каждую секунду, а нужно ввести желаемое значение в текст. поле и записать это значение в память по адресу 0x9E8625. (Input это текстовое поле ввода)

Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#Include <Timers.au3>
#Include <WinAPIEx.au3>

#Region ### START Koda GUI section ### Form=
Local $Form1 = GUICreate("Form1", 754, 553, 192, 124)
Local $aInput[135], $c = 0, $nMsg

For $y = 0 To 8
  For $a = 0 To 14
    $aInput[$c] = GUICtrlCreateInput('Input' & $a+1 + $y*15, 12+$y*80, 32+$a*32 , 55, 21)
    $c += 1
  Next
Next

$process = "ePSXe.exe"
$pid = 0                  ;Set game PID to 0
$timedelay = _Timer_Init() ;Start delay timer

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $aInput[0] To $aInput[UBound($aInput) - 1]
        ;ConsoleWrite("Input " & $nMsg - $aInput[0] & " has been modified" & @CRLF)
    EndSwitch

    If $pid = 0 And _Timer_Diff($timedelay) > 1000 Then            ;Check if PID not found yet, and delay is more than 1000 milliseconds
        $pid = ProcessExists($process)                            ;If game exists get the PID
        If $pid > 0 Then                                          ;Game exist?
            $hwnd = _MemoryOpen($pid)                             ;Opens a process and enables all possible access rights to the process
        EndIf
        $timedelay = _Timer_Init()                                ;Reset delay timer
    ElseIf $pid > 0 And _Timer_Diff($timedelay) > 1000 Then        ;Check if PID found and delay is more than 1000 milliseconds
            $Static = "0x" & Hex(4194304 + 6194725)             ;Base address 0x400000 + 5E8625 (address in decimal)
            For $x = 0 To 134
            local $offset = 132* Int($x / 15) + Mod($x,15)
            $readvalue = _MemoryRead($Static+$offset, $hwnd, 'BYTE')       ;Static address
            GUICtrlSetData($aInput[$x], $readvalue)
            Next
        $timedelay = _Timer_Init()                                ;Reset delay timer
    EndIf
WEnd

Вопрос № 3: Этот код выше можно как-то улучшить, оптимизировать?
 
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
Вопросы сформулированы так, что нужно догадываться, а что же имелось в виду. Функция InputBox() считывает то, что введёт пользователь, а не с потолка. Имеется ли в виду, что на время пассивности пользователя должно автоматически вводиться предыдущее значение каждую секунду? Для этого нет надобности в том, чтобы висел какой-то интерфейс (а в данном случае таковой просто останавливает работу скрипта). Просто по горячей клавише можно вызывать функцию, которая по надобности и отсчёт времени остановит, и пользовательский ввод обработает.
 
Автор
R

Raz

Новичок
Сообщения
2
Репутация
0
Вопросы сформулированы так, что нужно догадываться, а что же имелось в виду. Функция InputBox() считывает то, что введёт пользователь, а не с потолка. Имеется ли в виду, что на время пассивности пользователя должно автоматически вводиться предыдущее значение каждую секунду?
Нет. Нужно при в вводе значения в текстовом поле "Input" записать 1 раз введенное значение в память процесса. (Если попроще, есть GUI форма с контролом (текстовое поле) "Input", в него считывается значение из адреса в памяти 0x9E8625 каждую секунду. Нужно при вводе желаемого значения в контроле "Input1", записать это значение в память по адресу 0x9E8625.)
(Подправил описание вопроса в начале темы)
 
Последнее редактирование:
Верх