alors je me suis dis, pourquoi pas utiliser le joystick a la place du Clavier ?
malheureusement, avec world OF tanks, ce code ne marchera pas, car je pense que WOT utilise une gestion Personalisé du clavier ....
seul la souris simulée par le joystick fonctionne !
je voulais asservir les mouvements du tanks au joystick , et garder la souris pour pointer et tourner la tourrelle du char
les boutons du jsoystick (tir et visé auto) fonctionne , mais des qu'il sagit de simuler une touche clavier, ça ne marche plus !!
cependant mon code fonctionne tres bien !
c'est juste le Jeux World Of Tanks qui semble ne pas vouloir Obtempérer au commande clavier envoyé par le prg ...
on dirai qu'ils detecte l'appuis d'une touche de façon physique , je ne sais vraiment pas comment il peuvent proceder
si vous avez un prg de jeux qui soit moins "bloqué" essayez mon code si dessous !
a savoir que le touches Flechées du clavier sont simulé si on bouge le manche du jostick (haut bas ,gauche/droite )
comme j'ai un joystick qui permet la rotation de l'axe (mouvement Z) , j'ai quand meme asservi ce mouvement au touche flechées gauche/droite
le but etant de faire pivoter mon char sur lui meme a l'origine
les boutons du joystick son eux reconnu sans probleme puisque ils asservisent les touches de la souris (bouton 1 joystick = bouton souris gauche //bouton 2 joystick = bouton souris droite)
dans ce code, et pour bien le comprendre, j'ai donc cherché a simuler les mouvements de mon char dont voici les commandes clavier
mouvement gauche du joystick /ou rotation gauche du manche du joystick => appuis sur Clavier fleche gauche
mouvement droite du joystick / ou rotation droite du manche du joystick = > appuis sur clavier fleche droite
mouvement vertical haut du joystick => appuis sur Clavier fleche Haut
mouvement vertical bas du joystick => appuis sur Clavier fleche bas
;*
Appuis sur bouton 1 joystick => Appuis sur bouton Gauche de la souris (sensé tirer dans WOT )
Appuis sur bouton 2 joystick => appuis sur bouton droit de la souris (sensé visé automatique dans WOT )
appuis sur bouton 4 joystick => appuis sur barre d'espace (sensé Visé Sniper dans WOT )
voici le code, qui fera de toute façon une base pour faire ce genre de bidouille sur l'un de vos jeux
Code : Tout sélectionner
;***********************************************
;Titre :*joystick_clavier
;Auteur : Zorro
;Date :21/06/2017
;Heure :09:49:23
;Version Purebasic : PureBasic 5.60 (Windows - x86)
;Version de l'editeur :EPB V2.64
; Libairies necessaire : Aucune
;***********************************************
; utilisation de la procedure SendKeys(Handle,window$,keys$) en lieu et place des appel directe a l'api keybd_event_( #VK_DOWN ,0,0,0) et keybd_event_( #VK_DOWN ,0,2,0)
; cette procedure est visible dans les tutos sur la souris dans le forum , et proviens d'un code du forum Anglais ...
; pour la souris, et ses touches c'est l'api mouse_event_(#MOUSEEVENTF_RIGHTDOWN,xm,ym,0,1) ; qui est utilisé
#MOUSEEVENTF_RIGHTDOWN=8
;#MOUSEEVENTF_RIGHTUP=10
Declare sendkeys(handle,window$,keys$)
; a utiliser si on utilise les Api directement au lieu de la procedure
;Window$="Client de WoT"
;Handle=FindWindow_(0,window$)
; ----------- exemples d'utilisation de la procedure ------------------
; ** soit pour envoyer une sequence de caractere a une application ouverte
;SendKeys(0,"japbe",";on va ecrire une nouvelle ligne{ENTER}")
; ** soit pour envoyer l'appuis d'une touche (ici la touche flechée haut )
;SendKeys(0,""Client de WoT"","{UP}")
OpenWindow(0, 0, 0, 320, 200, "Joystick_Clavier", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If InitJoystick()=0
MessageRequester("Mouser Error","No controller detected",#MB_ICONSTOP)
End
EndIf
Global Flag_Haut=0
Global Flag_Bas=0
Global Flag_Rot_Gauche=0
Global Flag_Rot_Droite=0
Global Flag_bouton1=0
Global Flag_bouton2=0
Global Flag_bouton4=0
Window$="Client de WoT"
Handle=FindWindow_(0,window$)
If Handle
SetForegroundWindow_(handle)
Else
MessageRequester("Info","le prg :" +Window$+" n'est pas lancé")
End
Endif
Repeat
Event= WaitWindowEvent(20)
If ExamineJoystick(0)
dx=JoystickAxisX(0,#PB_Absolute)
dy=JoystickAxisY(0,#PB_Absolute)
Dz=JoystickAxisZ(0,#PB_Relative) ; Absolute dont Work !!!!
bouton1=JoystickButton(0,1)
bouton2= JoystickButton(0,2)
bouton3=JoystickButton(0,3)
bouton4=JoystickButton(0,4)
bouton5=JoystickButton(0,5)
bouton6=JoystickButton(0,6)
bouton7=JoystickButton(0,7)
bouton8=JoystickButton(0,8)
bouton9=JoystickButton(0,9)
bouton10=JoystickButton(0,10)
bouton11=JoystickButton(0,11)
bouton12=JoystickButton(0,12)
; ***
Select bouton1
Case 0
If Flag_bouton1=1
Flag_bouton1=0
mouse_event_(#MOUSEEVENTF_LEFTUP,xm,ym,0,1) ; relache
Endif
Case 1
debug "bouton 1 " +str(bouton1)
mouse_event_(#MOUSEEVENTF_LEFTDOWN,xm,ym,0,1)
Flag_bouton1=1
Delay(50)
mouse_event_(#MOUSEEVENTF_LEFTUP,xm,ym,0,1) ; relache
EndSelect
; ***
Select bouton2
Case 0
if Flag_bouton2=1
Flag_bouton2=0
mouse_event_(#MOUSEEVENTF_RIGHTUP,xm,ym,0,1) ;appuis
Endif
Case 1
debug "bouton 2 " +str(bouton2)
mouse_event_(#MOUSEEVENTF_RIGHTDOWN,xm,ym,0,1) ; appuis
Flag_bouton2=1
Delay(50)
mouse_event_(#MOUSEEVENTF_RIGHTUP,xm,ym,0,1) ;relache
EndSelect
; ***
Select bouton3
Case 0
;debug "bouton 3 " +str(bouton3)
Case 1
debug "bouton 3 " +str(bouton3)
EndSelect
; ***
Select bouton4
Case 0
;debug "bouton 4 " +str(bouton4)
if Flag_bouton4 = 1
Delay(50)
keybd_event_( #VK_SPACE ,0,2,0) ;relache
Flag_bouton4 = 0
Endif
Case 1
debug "bouton 4 " +str(bouton4)
keybd_event_( #VK_SPACE ,0,0,0) ;Press
Flag_bouton4 = 1
EndSelect
; ***
Select bouton5
Case 0
Case 1
debug "bouton 5 " +str(bouton5)
EndSelect
; ***
Select bouton6
Case 0
Case 1
debug "bouton 6 " +str(bouton6)
EndSelect
; ***
Select bouton7
Case 0
Case 1
debug "bouton 7 " +str(bouton7)
EndSelect
; ***
Select bouton8
Case 0
Case 1
debug "bouton 8 " +str(bouton8)
EndSelect
;***;
Select bouton9
Case 0
Case 1
debug "bouton 9 " +str(bouton9)
EndSelect
;***;
Select bouton10
Case 0
Case 1
debug "bouton 10 " +str(bouton10)
EndSelect
;***;
Select bouton11
Case 0
Case 1
debug "bouton 11 " +str(bouton11)
EndSelect
;***;
Select bouton12
Case 0
Case 1
debug "bouton 12 " +str(bouton12)
EndSelect
; **************************LE CLAVIER **************************
Select DX
Case 0 ; plus d'action sur l'axe des X du joystick
if Flag_droite=1
Flag_droite=0
debug "X" +str(DX)
Endif
if Flag_Gauche=1
Flag_Gauche=0
debug "X" +str(DX)
Endif
Case 1 ; droite
Flag_droite=1
Flag_gauche=0
debug "X" +str(DX)
SendKeys(0,Window$,"{RIGHT}") ; action sur l'axe des X du joystick , donc on press la touche flechée droite
Case -1 ; Gauche
Flag_gauche=1
Flag_droite=0
debug "X" +str(DX)
; keybd_event_( #VK_LEFT ,0,0,0) ; autre façon de faire
SendKeys(0,Window$,"{LEFT}"); action sur l'axe des X du joystick , donc on press la touche flechée gauche
EndSelect
;***
Select Dy
Case 0
If Flag_haut=1
debug "Y"+str(DY)
Flag_haut=0
Endif
if Flag_bas=1
Flag_bas=0
debug "Y"+str(DY) ;
Endif
Case 1 ; Bas
debug "Y"+str(DY)
;keybd_event_( #VK_DOWN ,0,0,0) ; ; autre façon de faire
SendKeys(0,Window$,"{DOWN}") ;; action sur l'axe des Y du joystick , donc on press la touche flechée bas
Flag_bas=1
Flag_haut=0
;keybd_event_( #VK_UP ,0,2,0) ; relache ; autre façon de faire
Case -1 ; Haut
debug "Y"+str(DY)
SendKeys(0,Window$,"{UP}") ; action sur l'axe des Y du joystick , donc on press la touche flechée Haute
Flag_haut=1
Flag_bas=0
;keybd_event_( #VK_Down ,0,2,0) ; relache ; autre façon de faire
EndSelect
;***
select Dz
Case 0
if Flag_rot_Droite=1
Flag_rot_Droite=0
debug "Z" +str(Dz)
; keybd_event_( #VK_RIGHT ,0,2,0) ; relache ; autre façon de faire
Endif
If Flag_rot_Gauche=1
Flag_rot_Gauche=0
debug "Z" +str(Dz)
; keybd_event_( #VK_LEFT ,0,2,0) ; Relache ; autre façon de faire
Endif
Case 1 ; ROT Droite
debug "Z" +str(Dz)
;keybd_event_( #VK_RIGHT ,0,0,0) ; press ; autre façon de faire
SendKeys(0,Window$,"{RIGHT}") ; action sur l'axe des Z du joystick , donc on press la touche flechée droite
Flag_rot_Droite=1
Flag_rot_Gauche=0
; keybd_event_( #VK_LEFT ,0,2,0) ; Relache ; autre façon de faire
Case -1 ; ROT Gauche
debug "Z" +str(Dz)
; keybd_event_( #VK_LEFT ,0,0,0)
SendKeys(0,Window$,"{LEFT}") ;; action sur l'axe des Z du joystick , donc on press la touche flechée Gauche
Flag_rot_Gauche=1
Flag_rot_Droite=0
; keybd_event_( #VK_RIGHT ,0,2,0) ; relache ; autre façon de faire
Endselect
Endif
Until Event = #PB_Event_CloseWindow
Procedure SendKeys(Handle,window$,keys$)
If window$<>"" : Handle=FindWindow_(0,window$) : EndIf ; Use window$ instead of handle.
If IsWindow_(Handle)=0 ; Does the target window actually exist?
ProcedureReturn 0 ; Nope, so report 0 for failure to type.
Else
; This block gives the target window the focus before typing.
thread1=GetWindowThreadProcessID_(GetForegroundWindow_(),0)
thread2=GetWindowThreadProcessID_(Handle,0)
If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#True) : EndIf
SetForegroundWindow_(Handle) ; Target window now has the focus for typing.
Sleep_(125) ; 1/8 second pause before typing to prevent fast CPU problems.
; Now the actual typing starts.
keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key before typing.
keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key before typing.
keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key before typing.
keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0) ; Release WINDOWS key before typing.
For r=1 To Len(keys$)
vk$=Mid(keys$,r,1)
If vk$="{" ; Special key found.
s=FindString(keys$,"}",r+1)-(r+1) ; Get length of special key.
s$=Mid(keys$,r+1,s) ; Get special key name.
Select s$ ; Get virtual key code of special key.
Case "ALTDOWN" : keybd_event_(#VK_MENU,0,0,0) ; Hold ALT down.
Case "ALTUP" : keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT.
Case "BACKSPACE" : vk=#VK_BACK
Case "CONTROLDOWN" : keybd_event_(#VK_CONTROL,0,0,0) ; Hold CONTROL down.
Case "CONTROLUP" : keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL.
Case "DELAY" : vk=0 : Sleep_(1000) ; Delay typing for one second.
Case "DELETE" : vk=#VK_DELETE
Case "DOWN" : vk=#VK_DOWN
Case "END" : vk=#VK_END
Case "ENTER" : vk=#VK_RETURN
Case "ESCAPE" : vk=#VK_ESCAPE
Case "F1" : vk=#VK_F1
Case "F2" : vk=#VK_F2
Case "F3" : vk=#VK_F3
Case "F4" : vk=#VK_F4
Case "F5" : vk=#VK_F5
Case "F6" : vk=#VK_F6
Case "F7" : vk=#VK_F7
Case "F8" : vk=#VK_F8
Case "F9" : vk=#VK_F9
Case "F10" : vk=#VK_F10
Case "F11" : vk=#VK_F11
Case "F12" : vk=#VK_F12
Case "HOME" : vk=#VK_HOME
Case "INSERT" : vk=#VK_INSERT
Case "LEFT" : vk=#VK_LEFT
Case "PAGEDOWN" : vk=#VK_NEXT
Case "PAGEUP" : vk=#VK_PRIOR
Case "PRINTSCREEN" : vk=#VK_SNAPSHOT
Case "RETURN" : vk=#VK_RETURN
Case "RIGHT" : vk=#VK_RIGHT
Case "SPACE" : vk=#VK_SPACE
Case "SHIFTDOWN" : shifted=1 : keybd_event_(#VK_SHIFT,0,0,0) ; Hold SHIFT down.
Case "SHIFTUP" : shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT.
Case "TAB" : vk=#VK_TAB
Case "UP" : vk=#VK_UP
Case "WINDOWS" : vk=#VK_LWIN
EndSelect
If Left(s$,3)<>"ALT" And Left(s$,7)<>"CONTROL" And Left(s$,5)<>"SHIFT"
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the special key.
EndIf
r+s+1 ; Continue getting the keystrokes that follow the special key.
Else
vk=VkKeyScanEx_(Asc(vk$),GetKeyboardLayout_(0)) ; Normal key found.
If vk>303 And shifted=0 : keybd_event_(#VK_SHIFT,0,0,0) : EndIf ; Due to shifted character.
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the normal key.
If vk>303 And shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) : EndIf ; Due to shifted character.
EndIf
Next
If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf ; Finished typing to target window!
keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key in case user forgot.
keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key in case user forgot.
keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key in case user forgot.
keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0) ; Release WINDOWS key in case user forgot.
ProcedureReturn 1 ; Report successful typing! :)
EndIf
EndProcedure
a noter que j'ai signalé un bug sur le forum de Purebasic anglais
a propos de la fonction
Code : Tout sélectionner
Dz=JoystickAxisZ(0,#PB_Relative) ; Absolute dont Work !!!!
et que #PB_Absolute, ne renvoie rien ....