[.NET] Tasten ins Game Senden?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Valvepro, 22. Februar 2009 .

Schlagworte:
  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  1. #1 22. Februar 2009
    Tasten ins Game Senden?

    Hi, wie kann ich Tasten in einem Game Simulieren...

    PostMessageA(hwnd, WM_KEYDOWN, VIRTUELLKEY, NULL); <-----Damit kann ich nur in den chat schreiben jedoch keine fertigkeit callen...

    Ich hoffe einer von euch weiss warum es nicht geht :(
     

  2. Anzeige
  3. #2 22. Februar 2009
    AW: Tasten ins Game Senden?

    Ich schließe mich der Suche an. Das problem ist, dass das irgendwie per Low Level Key Hook funktioniert. Ich habs zwar geschafft, Tasten abzufangen, aber nocht nicht zu senden.
     
  4. #3 22. Februar 2009
  5. #4 22. Februar 2009
    AW: Tasten ins Game Senden?

    hmm, damit kann ich so leider nichts anfangen... bräuchte ein Bsp.?(
    wäre ziemlich dankbar!


    EDIT: Kann keiner weiter helfen?
     
  6. #5 28. Februar 2009
    AW: Tasten ins Game Senden?

    Hooks sollten nicht funktionieren, da die nur System-globale Msg.es abfangen. Spiele arbeiten ja bekanntermaßen mit DirectX und da wird DirectInput verwendet. DirectInput liegt sozusagen über der WindowsApi und fängt alle Eingabe-Events ab, interpretiert diese und sendet die Befehle sofort an die Hardware. Demnach müsstest du also DirectInput bzw. SendInput verwenden.

    Ich weiß jetzt nicht, welche Programmiersprache du verwendest, aber hier mal in C# der notwendige Code:

    Code:
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
    
    [StructLayout(LayoutKind.Explicit)] // Structures sollen wie deklariert in Speicher geschrieben
    // werden
    struct INPUT
    {
    [FieldOffset(0)]
    public int type;
    [FieldOffset(4)]
    public MOUSEINPUT mi;
    [FieldOffset(4)]
    public KEYBDINPUT ki;
    [FieldOffset(4)]
    public HARDWAREINPUT hi;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct MOUSEINPUT
    {
    public int dx;
    public int dy;
    public uint mouseData;
    public uint dwFlags;
    public uint time;
    public IntPtr dwExtraInfo;
    }
    
    [StructLayout(LayoutKind.Sequential)]
    struct KEYBDINPUT
    {
    ushort wVk;
    ushort wScan;
    uint dwFlags;
    uint time;
    IntPtr dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct HARDWAREINPUT
    {
    uint uMsg;
    ushort wParamL;
    ushort wParamH;
    }
    
    // Die ScanCodes für deine Maus, wodurch deinem Programm die notwendigen 
    // Speicheradressen im Puff 
    const uint MOUSEEVENTF_MOVE = 0x0001;
    const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
    const uint MOUSEEVENTF_LEFTUP = 0x0004;
    const uint MOUSEEVENTF_RIGHTDOWN = 0x0008;
    const uint MOUSEEVENTF_RIGHTUP = 0x0010;
    const uint MOUSEEVENTF_MIDDLEDOWN = 0x0020;
    const uint MOUSEEVENTF_MIDDLEUP = 0x0040;
    const uint MOUSEEVENTF_XDOWN = 0x0080;
    const uint MOUSEEVENTF_XUP = 0x0100;
    const uint MOUSEEVENTF_WHEEL = 0x0800;
    const uint MOUSEEVENTF_VIRTUALDESK = 0x4000;
    const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
    const int INPUT_MOUSE = 0;
    
    Wenn du jetzt z.b. einen Mausklick simulieren möchtest:

    Code:
    MOUSEINPUT m = new MOUSEINPUT();
    m.dx = x;
    m.dy = y;
    m.mouseData = 0;
    m.time = 0;
    m.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN;
    
    INPUT i = new INPUT();
    i.type = INPUT_MOUSE;
    i.mi = m;
    
    INPUT[] inputs = new INPUT[] { i };
    int isize = Marshal.SizeOf(i);
    SendInput(1, inputs, isize);

    Für einen Tastendruck brauchst du also nur:

    Code:
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
    
    [StructLayout(LayoutKind.Explicit)]
    struct INPUT
    {
    [FieldOffset(0)]
    public int type;
    [FieldOffset(4)]
    public MOUSEINPUT mi;
    [FieldOffset(4)]
    public KEYBDINPUT ki;
    [FieldOffset(4)]
    public HARDWAREINPUT hi;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct KEYBDINPUT
    {
    ushort wVk;
    ushort wScan;
    uint dwFlags;
    uint time;
    IntPtr dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct HARDWAREINPUT
    {
    uint uMsg;
    ushort wParamL;
    ushort wParamH;
    }
    
    // Und hier die jeweiligen ScanCodes für deine Tastatur (kannst du mal googeln)
    
    
    Dann

    Code:
    KEYBDINPUT m = new KEYBDINPUT();
    // Analog zu MOUSEINPUT eben
    
    INPUT i = new INPUT();
    i.type = INPUT_KEYBD;
    i.mi = m;
    
    INPUT[] inputs = new INPUT[] { i };
    int isize = Marshal.SizeOf(i);
    SendInput(1, inputs, isize);

    In Delphi geht das ganze schon ein wenig einfacher:

    Code:
    Procedure DXKeypress ( Key : integer; Down : Boolean );
    Const
     DX_UP : Integer = 200;
     DX_DOWN : Integer = 208;
     DX_LEFT : Integer = 203;
     DX_RIGHT : Integer = 205;
     DX_RETURN : Integer = 28;
    var
     dxKey : integer;
     flag : integer;
    begin
    
     case Key of
     VK_LEFT : dxKey := DX_LEFT;
     VK_RIGHT : dxKey := DX_RIGHT;
     VK_UP : dxKey := DX_UP;
     VK_DOWN : dxKey := DX_DOWN;
     VK_RETURN: dxKey := DX_RETURN;
     end;
    
    
     if Down then flag := 0 else Flag := 2;
    
     keybd_event(0, dxKey,Flag,0);
    end;
    Für Pfeiltasten und Enter zum Beispiel.

    Edit: Ok, hab mir mal SchOudeBläS Links angesehen und da steht ja schon eigentl. alles nötige. :D
    Für C++ hab ich jetzt leider kein passendes Beispiel...
     
  7. #6 1. März 2009
    AW: Tasten ins Game Senden?

    Und genau um C++ ging es :S schade....
     
  8. #7 1. März 2009
    AW: Tasten ins Game Senden?

    Vielleicht ist das hier was für dich?

    http://www.tutorials.de/forum/c-c/311855-tastendruck-umleiten.html

    Du müsstest theoret. ja bloß die IF-Anweisung weg lassen und den Scancode ändern....

    Ansonsten setz dich halt nochmal mit den Links von SchOudeBläS auseinander, in den Beispielcodes ist ja genau das angewendet.
     
  9. #8 1. März 2009
    AW: Tasten ins Game Senden?

    Noch eine kleine Frage, ist es überhaupt möglich so Tasten ins inaktive Fenster zu senden?
     

  10. Videos zum Thema
Die Seite wird geladen...