Entwickler-Ecke
Windows API - Tastendruck Simulieren in Games
Niko S. - Di 16.01.07 23:13
Titel: Tastendruck Simulieren in Games
Also ich wollte mal ein programm machen welches eine oder mehrere F-Tasten drückt..
Funktioniert auch!
Aber nicht in Spielen.
Weiß einer vielleicht warum?
Karlson - Di 16.01.07 23:34
Manche Spiele fragen Tastendrücke nicht über die WindowsAPI ab.
Evt. hast du also einen Fehler in deinem Code, oder die getesteten Spiele beziehen den Tastendruck AFAIK(!) vom Direct-Play Treiber (wenns ein DirectX Spiel ist). An diesen könntest du theoretisch deinen Tastendruck senden, allerdings habe ich mich noch nie damit beschäftigt, kann dir da ergo nicht helfen.
Alternativ zeig doch am besten noch man deinen relevanten Code ;)
Niko S. - Di 16.01.07 23:39
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean); type TShiftKeyInfo = record shift: Byte; vkey: Byte; end; byteset = set of 0..7; const shiftkeys: array [1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl); vkey: VK_CONTROL), (shift: Ord(ssShift); vkey: VK_SHIFT), (shift: Ord(ssAlt); vkey: VK_MENU)); var flag: DWORD; bShift: ByteSet absolute shift; i: Integer; begin for i := 1 to 3 do begin if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0); end; if specialkey then flag := KEYEVENTF_EXTENDEDKEY else flag := 0;
keybd_event(key, MapvirtualKey(key, 0), flag, 0); flag := flag or KEYEVENTF_KEYUP; keybd_event(key, MapvirtualKey(key, 0), flag, 0);
for i := 3 downto 1 do begin if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0); end; end; |
Das habe ich benutzt.
Und das fürs drücken:
Delphi-Quelltext
1: 2:
| keybd_event(VK_F1, MapVirtualKey(VK_F1, 0), 0, 0); keybd_event(VK_F1, MapVirtualKey(VK_F1, 0), KEYEVENTF_KEYUP, 0); |
Und in normalen browsern etc funktioniert das auch nur halt in Games nicht.
perry5 - Mi 17.01.07 00:57
VK_F1 ist ganz offensichtlich eine Windwosnachricht, und für ungefähr sämtliche Speiel ungeeignet.
Würde die alle mit WinAPI gehen, und man würde nach oben drücken. würd der erst einen Schrit t machen und nach 3 sek hundert nacheinander, kurz unspielbar. Halt genau das verhalten, wenn du in nem Eingabefeld eine Taste gedrückt hältst. Für F1 Tasten amg das ganz ok sein, aber wenn ein Spiel schon DInput nutzt, warum dann für n paar exotische Tasten umsteigen?
Du muss schon an DInput ran, oder an den Tastaturtreiber. Und erwarte nicht das es einfach wird, und das du das unter einer Seite Code schaffst.
Es dürfte zumal gar nicht so einfach sein, jemanden zu finden, der das kann. Ob od ders dann mit Dlephi macht ist auchfraglich. Und so tiefe systemeigene Sachen mal eben so in Dlephi umzusetzen, das muss dann auch wieder können.
Ich bin mir zudem gar nicht sicher, ob du direkt an DInput gehen kannst, oder ob du den Tastaturreiber modifizieren musst.
Also viel Spaß noch :-P
Niko S. - Mi 17.01.07 08:28
Weis einer wo ich diese Komponente finden kann für Delphi 7?
Ich hab für Delphi 5 gefunden aber wenn ich das ins neue format bringen will gibt's access fehler.
perry5 - Mi 17.01.07 16:31
Hm, welche Komponente den?
Und wo gibts den Fehler?
Niko S. - Mi 17.01.07 17:07
na DInput Komponente oder ist das keine Komponente?
Robinator - Mi 17.01.07 17:26
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| 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; |
Das ist jetzt nur für die Pfeiltasten und Enter... die anderen dx keycodes gibts alle im internet.. einfach mal googlen... sollte soweit funktionieren.
grüsse, RoB
Fighter#1 - Mi 17.01.07 17:32
Nur so ne Frage ...
wüofür brauchst du das eigentlich?
Chryzler - Mi 17.01.07 17:37
Robinator hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| 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; |
Das ist jetzt nur für die Pfeiltasten und Enter... die anderen dx keycodes gibts alle im internet.. einfach mal googlen... sollte soweit funktionieren.
grüsse, RoB |
Hey danke! Funktioniert perfekt! :D Jetzt würde mich nur noch interessieren, woher du den Code hast. Hast du danach gegoogelt oder haste das einfach gewusst. Respekt...
Chryzler
Robinator - Mi 17.01.07 17:43
Das hab ich einfach gewusst... bzw. irgendwann mal rausgefunden und mir gemerkt :)
grüsse
Robinator - Mi 17.01.07 17:46
Ps.: Elma rockt! :P
Niko S. - Mi 17.01.07 22:28
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| 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; DX_F1 : Integer = 1; DX_F2 : Integer = 2; DX_F3 : Integer = 3; DX_F4 : Integer = 4; DX_F5 : Integer = 5; DX_F6 : Integer = 6; DX_F7 : Integer = 7; DX_F8 : Integer = 8; DX_F9 : Integer = 9; DX_F10 : Integer = 10; DX_F11 : Integer = 11; DX_F12 : Integer = 12;
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; VK_F1: dxKey := DX_F1; VK_F2: dxKey := DX_F2; VK_F3: dxKey := DX_F3; VK_F4: dxKey := DX_F4; VK_F5: dxKey := DX_F5; VK_F6: dxKey := DX_F6; VK_F7: dxKey := DX_F7; VK_F8: dxKey := DX_F8; VK_F9: dxKey := DX_F9; VK_F10: dxKey := DX_F10; VK_F11: dxKey := DX_F11; VK_F12: dxKey := DX_F12; end;
if Down then flag := 0 else Flag := 2;
keybd_event(0, dxKey,Flag,0); end; |
Delphi-Quelltext
1: 2:
| DXKeyPress(1,True); DXKeyPress(1,False); |
Da passiert nix!
Hab ich was falsch gemacht?
Robinator - Mi 17.01.07 23:06
1 ist soweit ich weis VK_LBUTTON. Versuch einfach mal ne Sinnvollere Taste zu übergeben... eine die du auch in der Case abfrage drinhast.
gruss
Niko S. - Mi 17.01.07 23:51
Oha Ich dacht die kann man beliebig setzen.
Ich hab schon verzweifelt gegoogelt ich bin wohl kein guter googler.
Ich find keine dx Keys <_< keine lsitne und keine integer werte
perry5 - Do 18.01.07 01:10
Alternativ kannst du dir das DX SDK runterladen, in desse Headerdateien steht alles drinne.
Robinator - Do 18.01.07 03:38
hier mal die (hoffentlich) komplette liste
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149:
| DIK_ESCAPE : integer = $01; DIK_1 : integer = $02; DIK_2 : integer = $03; DIK_3 : integer = $04; DIK_4 : integer = $05; DIK_5 : integer = $06; DIK_6 : integer = $07; DIK_7 : integer = $08; DIK_8 : integer = $09; DIK_9 : integer = $0A; DIK_0 : integer = $0B; DIK_MINUS : integer = $0C; DIK_EQUALS : integer = $0D; DIK_BACK : integer = $0E; DIK_TAB : integer = $0F; DIK_Q : integer = $10; DIK_W : integer = $11; DIK_E : integer = $12; DIK_R : integer = $13; DIK_T : integer = $14; DIK_Y : integer = $15; DIK_U : integer = $16; DIK_I : integer = $17; DIK_O : integer = $18; DIK_P : integer = $19; DIK_LBRACKET : integer = $1A; DIK_RBRACKET : integer = $1B; DIK_RETURN : integer = $1C; DIK_LCONTROL : integer = $1D; DIK_A : integer = $1E; DIK_S : integer = $1F; DIK_D : integer = $20; DIK_F : integer = $21; DIK_G : integer = $22; DIK_H : integer = $23; DIK_J : integer = $24; DIK_K : integer = $25; DIK_L : integer = $26; DIK_SEMICOLON : integer = $27; DIK_APOSTROPHE : integer = $28; DIK_GRAVE : integer = $29; DIK_LSHIFT : integer = $2A; DIK_BACKSLASH : integer = $2B; DIK_Z : integer = $2C; DIK_X : integer = $2D; DIK_C : integer = $2E; DIK_V : integer = $2F; DIK_B : integer = $30; DIK_N : integer = $31; DIK_M : integer = $32; DIK_COMMA : integer = $33; DIK_PERIOD : integer = $34; DIK_SLASH : integer = $35; DIK_RSHIFT : integer = $36; DIK_MULTIPLY : integer = $37; DIK_LMENU : integer = $38; DIK_SPACE : integer = $39; DIK_CAPITAL : integer = $3A; DIK_F1 : integer = $3B; DIK_F2 : integer = $3C; DIK_F3 : integer = $3D; DIK_F4 : integer = $3E; DIK_F5 : integer = $3F; DIK_F6 : integer = $40; DIK_F7 : integer = $41; DIK_F8 : integer = $42; DIK_F9 : integer = $43; DIK_F10 : integer = $44; DIK_NUMLOCK : integer = $45; DIK_SCROLL : integer = $46; DIK_NUMPAD7 : integer = $47; DIK_NUMPAD8 : integer = $48; DIK_NUMPAD9 : integer = $49; DIK_SUBTRACT : integer = $4A; DIK_NUMPAD4 : integer = $4B; DIK_NUMPAD5 : integer = $4C; DIK_NUMPAD6 : integer = $4D; DIK_ADD : integer = $4E; DIK_NUMPAD1 : integer = $4F; DIK_NUMPAD2 : integer = $50; DIK_NUMPAD3 : integer = $51; DIK_NUMPAD0 : integer = $52; DIK_DECIMAL : integer = $53; DIK_OEM_102 : integer = $56; DIK_F11 : integer = $57; DIK_F12 : integer = $58; DIK_F13 : integer = $64; DIK_F14 : integer = $65; DIK_F15 : integer = $66; DIK_KANA : integer = $70; DIK_ABNT_C1 : integer = $73; DIK_CONVERT : integer = $79; DIK_NOCONVERT : integer = $7B; DIK_YEN : integer = $7D; DIK_ABNT_C2 : integer = $7E; DIK_NUMPADEQUALS : integer = $8D; DIK_PREVTRACK : integer = $90; DIK_AT : integer = $91; DIK_COLON : integer = $92; DIK_UNDERLINE : integer = $93; DIK_KANJI : integer = $94; DIK_STOP : integer = $95; DIK_AX : integer = $96; DIK_UNLABELED : integer = $97; DIK_NEXTTRACK : integer = $99; DIK_NUMPADENTER : integer = $9C; DIK_RCONTROL : integer = $9D; DIK_MUTE : integer = $A0; DIK_CALCULATOR : integer = $A1; DIK_PLAYPAUSE : integer = $A2; DIK_MEDIASTOP : integer = $A4; DIK_VOLUMEDOWN : integer = $AE; DIK_VOLUMEUP : integer = $B0; DIK_WEBHOME : integer = $B2; DIK_NUMPADCOMMA : integer = $B3; DIK_DIVIDE : integer = $B5; DIK_SYSRQ : integer = $B7; DIK_RMENU : integer = $B8; DIK_PAUSE : integer = $C5; DIK_HOME : integer = $C7; DIK_UP : integer = $C8; DIK_PRIOR : integer = $C9; DIK_LEFT : integer = $CB; DIK_RIGHT : integer = $CD; DIK_END : integer = $CF; DIK_DOWN : integer = $D0; DIK_NEXT : integer = $D1; DIK_INSERT : integer = $D2; DIK_DELETE : integer = $D3; DIK_LWIN : integer = $DB; DIK_RWIN : integer = $DC; DIK_APPS : integer = $DD; DIK_POWER : integer = $DE; DIK_SLEEP : integer = $DF; DIK_WAKE : integer = $E3; DIK_WEBSEARCH : integer = $E5; DIK_WEBFAVORITES : integer = $E6; DIK_WEBREFRESH : integer = $E7; DIK_WEBSTOP : integer = $E8; DIK_WEBFORWARD : integer = $E9; DIK_WEBBACK : integer = $EA; DIK_MYCOMPUTER : integer = $EB; DIK_MAIL : integer = $EC; DIK_MEDIASELECT : integer = $ED; |
Niko S. - Do 18.01.07 14:23
Wenn ich nach DX SDK suche bekomm ich DirectX SDK's XD
und die tasten da sind alle DIK o.O
Ich hab jetzt enifach die tasten eingefügt so wie mans eig machen sollte aber es passeirt weiterhin nix ...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| 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; DIK_F1 : integer = $3B; DIK_F2 : integer = $3C; DIK_F3 : integer = $3D; DIK_F4 : integer = $3E; DIK_F5 : integer = $3F; DIK_F6 : integer = $40; DIK_F7 : integer = $41; DIK_F8 : integer = $42; DIK_F9 : integer = $43; DIK_F10 : integer = $44;
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; VK_F1: dxKey := DIK_F1; VK_F2: dxKey := DIK_F2; VK_F3: dxKey := DIK_F3; VK_F4: dxKey := DIK_F4; VK_F5: dxKey := DIK_F5; VK_F6: dxKey := DIK_F6; VK_F7: dxKey := DIK_F7; VK_F8: dxKey := DIK_F8; VK_F9: dxKey := DIK_F9; VK_F10: dxKey := DIK_F10; end;
if Down then flag := 0 else Flag := 2;
keybd_event(0, dxKey,Flag,0); end;
--------------------------- DXKeyPress($3B,True); DXKeyPress($3B,False); |
Robinator - Do 18.01.07 14:39
Guck dir nochmal in ruhe die case abfrage an. Da wird überprüft welcher VK übergeben wird. Der code den du übergibst ist aber ein DIK. Macht also keinen sinn. Der von dir gesucht keycode ist
wenn du den übergibst wird (vorraussichtlich) alles funktionieren.
gruss
Niko S. - Do 18.01.07 15:06
Ich bin wohl einfach zu doof.
Ich hab jetzt alles ausprobiert in der case muss
VK:KEY : dxKey := i-was adneres
drinne stehen
Ich würd doch nur gern wissen die DX_F zahlehn damit ich das genau so amchen kann wie das mit den links und rechts tasten gemacht wurde ..
Obwohl ich grad gmerkt hab das nichtmal dies im browser funktioniert!
KleinesProgramm - So 14.09.08 13:11
mhh sieht nach nem guten ansatz aus... aber auch bei mir kommt wenig dabei raus...
kann einer ganz kurz nen code schreiben, wo z.B. erst für 2 Sekunden "A", und dann für 3 Sekunden "B" simuliert wird?
weil mit case kenn ich mich leider noch nicht so gut aus
Diamond - Di 16.09.08 07:52
Hatte damals auch mal das Problem damit! Es hat dann mit folgender Lösung geklappt!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| const VK_A : integer = $41; DIK_A : integer = $1E; VK_B : integer = $42; DIK_B : integer = $30; begin keybd_event(vk_a,dik_a,0,0); Sleep(2000); keybd_event(vk_a,dik_a,KEYEVENTF_KEYUP,0); keybd_event(vk_b,dik_b,0,0); Sleep(3000); keybd_event(vk_b,dik_b,KEYEVENTF_KEYUP,0); end; |
Ich will nicht behaupten dass der Code perfekt is ^^
Funktionieren tut er jedoch bei mir bisher in jeder Anwendung!
anbei noch eine Liste mit den VK_Keys und den DIK_Keys
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!