_WinAPI_OpenProcess
Возвращает дескриптор существующего объекта процесса
#include <WinAPI.au3>
_WinAPI_OpenProcess($iAccess, $fInherit, $iProcessID [, $fDebugPriv = False])
Параметры
$iAccess | Указывает доступ к объекту процесса |
$fInherit |
Указывает, может ли возвращаемый дескриптор быть унаследованным |
$iProcessID |
Идентификатор процесса (PID) |
$fDebugPriv |
[необязательный] Некоторые системные процессы не могут быть открыты, если у вас нет привилегий отладчика (debug security privilege). Если True, то эта функция будет пытаться открыть процесс с привилегиями отладки, в случае если процесс не может быть открыт со стандартными привилегиями доступа. |
Возвращаемое значение
Успех: | Возвращает дескриптор объекта процесса |
Ошибка: | Устанавливает @error |
См. также
_WinAPI_CloseHandle, _WinAPI_ReadProcessMemory, _WinAPI_WriteProcessMemoryСм. также
Искать OpenProcess в библиотеке MSDNПример
#include <ProcessConstants.au3>
#include <WinAPI.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
If StringInStr($CmdLineRaw, '--TestRun') Then
_ReadWriteMemory()
Exit
EndIf
$iVal = 100
$t = DllStructCreate('WORD')
DllStructSetData($t, 1, $iVal)
$hForm = GUICreate("Тестовая программа", 274, 97, -1, -1)
GUICtrlCreateLabel("Адрес памяти :", 60, 24, 81, 17)
GUICtrlCreateInput(DllStructGetPtr($t), 160, 20, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER,$ES_READONLY,$ES_NUMBER))
GUICtrlCreateLabel("Значение памяти :", 44, 60, 98, 17)
$Input = GUICtrlCreateInput(DllStructGetData($t, 1), 160, 56, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER,$ES_READONLY,$ES_NUMBER))
GUISetState(@SW_SHOW)
Sleep(1000)
If @Compiled Then
Run('"' & @ScriptFullPath & '" --TestRun')
Else
Run(FileGetShortName(@AutoItExe) & ' /AutoIt3ExecuteScript "' & FileGetShortName(@ScriptFullPath) & '" --TestRun')
EndIf
$begin = TimerInit()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If TimerDiff($begin) > 200 Then
$tmp = DllStructGetData($t, 1)
If $iVal <> $tmp Then
$iVal = $tmp
GUICtrlSetData($Input, $iVal)
EndIf
$begin = TimerInit()
EndIf
WEnd
Func _ReadWriteMemory()
$hWnd = WinGetHandle('[Title:Тестовая программа; Class:AutoIt v3 GUI]')
If $hWnd Then
$iPid = WinGetProcess($hWnd)
If $iPid Then
$iAddress = ControlGetText($hWnd, '', '[Class:Edit; Instance:1]')
If $iAddress > 0 Then
$iAddress = Int($iAddress);адрес памяти внешнего процесса
$hProcess = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, 0, $iPid)
If $hProcess Then
Local $iRead, $iWrite, $t = DllStructCreate('WORD')
For $i = 1 To 10
If ProcessExists($iPid) Then
; Чтение значения памяти
_WinAPI_ReadProcessMemory($hProcess, $iAddress, DllStructGetPtr($t), 2, $iRead)
$iVal = DllStructGetData($t, 1)
$iVal += 5
; Запись значения в память
DllStructSetData($t, 1, $iVal)
_WinAPI_WriteProcessMemory($hProcess, $iAddress, DllStructGetPtr($t), 2, $iWrite)
Else
ExitLoop
EndIf
Sleep(1000)
Next
If ProcessExists($iPid) Then
_WinAPI_CloseHandle($hProcess); Открытый процесс необходимо закрывать
EndIf
Else
MsgBox(16+4096, 'Ошибка', 'Не удалось открыть память тестовой программы')
EndIf
Else
MsgBox(16+4096, 'Ошибка', 'Не найден адрес памяти тестовой программы')
EndIf
Else
MsgBox(16+4096, 'Ошибка', 'Не найден процесс тестовой программы')
EndIf
Else
MsgBox(16+4096, 'Ошибка', 'Не найдено окно тестовой программы')
EndIf
EndFunc