Frage

Ich entwickle derzeit ein wenig Hobby-Projekt Gesundheitsinformationen in einem Spiel auf meiner G15 Tastatur durch VB.NET angezeigt werden soll.

Wenn ich über Readprocessmemory einen API-Aufruf verwenden, hält sie Null zurückkehrt. Die MSDN-Dokumentation bezeichnet mir die Marshal.GetLastWin32Error verwenden () aufrufen, um herauszufinden, was falsch ist, und es gibt 1400:. INVALID Fenstergriff

Ich bin jetzt verwirrt darüber, ob das erste Argument der Funktion eines Fenstergriff oder eine Prozess-ID will. Egal, ich habe versucht, beide mit Findwindow und hartzucodieren den Prozess-ID, während die Anwendung ausgeführt wird (es vom Task-Manager bekommen).

ich drei verschiedene Spiele ausprobiert habe, Urban Terror, Grand Theft Auto: SA und 3D-Flipper für Fenster, bekommt die Speicheradressen von einer Anwendung Cheat Engine genannt; sie alle scheinen zum Scheitern verurteilt.

Hier ist der Code verwende ich es zu tun:

API-Aufruf:

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

Methode:

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))

Könnte jemand mir bitte erklären, warum es nicht funktioniert? Vielen Dank im Voraus.

War es hilfreich?

Lösung

Zuerst Ihre Methodensignatur ist falsch, Einzel = Float während der ursprüngliche Parameter des LPBUF Typ ist.

Mit dieser Methode Signatur:

<DllImport("kernel32.dll", SetLastError=true)> _
Public Shared Function ReadProcessMemory( _
ByVal hProcess As IntPtr, _
ByVal lpBaseAddress As IntPtr, _
<Out()>ByVal lpBuffer() As Byte, _
ByVal dwSize as Integer, _
ByRef lpNumberOfBytesRead as Integer
) As Boolean
End Function

Zweitens glaube ich, dass der hProcess Griff einen Griff von Open Funktion, nicht der Fenstergriff.

geöffnet erwartet

Andere Tipps

Danke Arul, ich habe irgendwie mein Problem behoben.

Dim address As Integer
address = &HA90C62&
Dim floatvalueinmemory() As Byte

Dim proc As Process = Process.GetCurrentProcess
For Each proc In Process.GetProcesses
    If proc.MainWindowTitle = "3D Pinball for Windows - Space Cadet" Then
        Dim winhandle As IntPtr = OpenProcess(PROCESS_ACCESS.PROCESS_VM_READ, True, proc.Id)

        If ReadProcessMemory(winhandle, address, floatvalueinmemory, 4, 0) = 0 Then
            Dim lastError As Integer
            lastError = Marshal.GetLastWin32Error()
            MessageBox.Show(CStr(lastError))
            MsgBox("aww")
        Else
            MsgBox("woo")
        End If

        CloseHandle(winhandle)
    End If
Next

Jetzt ist es nach Ansicht der Handle gültig ist und versucht, die Prozesse Speicher zu lesen, aber ich erhalte die Fehlermeldung 299:. Nur ein Teil der Readprocessmemory oder Write Anforderung abgeschlossen wurde

Hat jemand irgendwelche Ideen, wie ich vorgehen soll dieses Problem zu beheben?

Meldung 299:. Nur ein Teil der Readprocessmemory oder Write Anforderung abgeschlossen wurde die Erinnerung bedeutete, dass ich geschützt war zu lesen versuche,

Vielen Dank für Ihre Hilfe, ich werde arul Antwort als Antwort markieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top