#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#3 22. Februar 2009 AW: Tasten ins Game Senden? schaut ma hier die 2 sachen könnten euch helfen SendInput function (Windows) keybd_event function (Windows) hoffe das ist das richtige, müsstet mit klar kommen wenn ihr den hook schon verstanden habt + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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. Für C++ hab ich jetzt leider kein passendes Beispiel... + Multi-Zitat Zitieren
#6 1. März 2009 AW: Tasten ins Game Senden? Und genau um C++ ging es :S schade.... + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren