В настоящее время я разрабатываю небольшой хобби-проект для отображения информации о здоровье в игре на моей клавиатуре G15 через VB.NET.
Когда я использую ReadProcessMemory через вызов API, он продолжает возвращать ноль. В документации MSDN мне было предложено использовать вызов Marshal.GetLastWin32Error (), чтобы выяснить, что не так, и он возвращает 1400: НЕВЕРНАЯ РУЧКА ОКНА.
Теперь я озадачен тем, хочет ли первый аргумент функции дескриптор окна или идентификатор процесса. Несмотря на это, я пробовал как с FindWindow, так и жестко кодировать идентификатор процесса во время работы приложения (получение из диспетчера задач).
Я пробовал три разные игры: Urban Terror, Grand Theft Auto: SA и 3D пинбол для окон, получая адреса памяти из приложения под названием Cheat Engine; кажется, все они терпят неудачу.
Вот код, который я использую для этого:
API Call:
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))
Может кто-нибудь объяснить мне, почему он не работает? Заранее спасибо.