В настоящее время я разрабатываю небольшой проект хобби для отображения информации о здоровье в игре на моей клавиатуре G15 через VB.NET.ReadProcessMemory продолжает возвращаться 0
Когда я использую ReadProcessMemory через вызов API, он продолжает возвращать ноль. В документации MSDN мне было предложено использовать вызов Marshal.GetLastWin32Error(), чтобы выяснить, что не так, и возвращает 1400: INVALID WINDOW HANDLE.
Теперь я запутался в том, нужен ли первый аргумент функции дескриптору окна или идентификатору процесса. Несмотря на это, я попытался использовать FindWindow и hardcoding идентификатор процесса во время работы приложения (получение его из диспетчера задач).
Я пробовал три разные игры, Urban Terror, Grand Theft Auto: SA и 3D пинбол для Windows, получая адреса памяти из приложения под названием Cheat Engine; все они, похоже, терпят неудачу.
Вот код, я использую, чтобы сделать это:
API вызовов:
Private Declare Function ReadProcessMemory Lib "kernel32" (_
ByVal hProcess As Integer, _
ByVal lpBaseAddress As Integer, _
ByRef lpBuffer As Single, _
ByVal nSize As Integer, _
ByRef lpNumberOfBytesWritten As Integer _
) As Integer
Метод:
Dim address As Integer
address = &HA90C62&
Dim valueinmemory As Integer
Dim proc As Process = Process.GetCurrentProcess
For Each proc In Process.GetProcesses
If proc.MainWindowTitle = "3D Pinball for Windows - Space Cadet" Then
If ReadProcessMemory(proc.Handle.ToInt32, address, valueinmemory, 4, 0) = 0 Then
MsgBox("aww")
Else
MsgBox(CStr(valueinmemory))
End If
End If
Next
Dim lastError As Integer
lastError = Marshal.GetLastWin32Error()
MessageBox.Show(CStr(lastError))
Может кто-нибудь, пожалуйста, объясните мне, почему он не работает ? Заранее спасибо.
Я попробую это, спасибо. – RodgerB 2008-12-06 22:53:11