Pb avec SendKeys

Résolu
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 - 1 mars 2007 à 22:35
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 - 2 mars 2007 à 10:21
Salut a tous,

Quand je créé un exe avec ce qui suit, si la led "Caps Lock" est allumée
j'obtiens ççççç et pas 99999
Qui peut me dire pourquoi ?
Vous l'aurez compris, je ne veux avoir que des chiffres, dans tous les cas .


Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Long


Const VK_CAPITAL = &H14 ' CapsLock


Private Sub Timer1_Timer()
    If (GetKeyState(VK_CAPITAL) > 0) Then
        SendKeys "9", False
    Else
        SendKeys "+9", False
    End If
End Sub

Merci de votre aide!

10 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
2 mars 2007 à 08:28
Re
1) l'utilisation de la fonction GetKeyboardState de la librairie user32 de l'Api de windows te permet de connaître l'état en cours de ton clavier

2) tu pourrais de surcroît te servir, plutôt que de Sendkeys, de la fonction SetKeyboardState de la même librairie pour modifier l'état de ton clavier
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 mars 2007 à 09:50
 


Une autre solution, c'est de simuler la saisie du code Ascii des touches...


Comme ca, si NumLock est allumé ou pas, tu sortira toujours le même caractère (et non plus touche)


SendKeys fonctionne par touche, lui...


 






Option Explicit

Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Function MapVirtualKey Lib "user32.dll" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

Private Const KEYEVENTF_KEYUP As Long = &H2
Private Const VK_LMENU As Long = &HA4
Private Const VK_NUMPAD0 = &H60

Private Sub SendChars(ByRef vsChars As String)
Dim i As Long
Dim sAsc As String
Dim iAsc As Long
Dim nKey As Long
  For i = 1 To Len(vsChars)
      keybd_event VK_LMENU, 0, 0, 0
     
      sAsc = "0" & Asc(Mid$(vsChars, i, 1))
      For iAsc = 1 To Len(sAsc)
          nKey = VK_NUMPAD0 + Mid$(sAsc, iAsc, 1)
          keybd_event nKey, MapVirtualKey(nKey, 0), 0, 0
          keybd_event nKey, MapVirtualKey(nKey, 0), KEYEVENTF_KEYUP, 0
      Next iAsc

      keybd_event VK_LMENU, 0, KEYEVENTF_KEYUP, 0
  Next i
End Sub<hr />
Private Sub Form_Click()
  SendChars "92148"
End Sub ,

----

By Renfield








Renfield





Admin CodeS-SourceS

- MVP Visual Basic
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
1 mars 2007 à 22:57
Bonsoir,

"Quand je créé un exe avec ce qui suit, si la led "Caps Lock" est allumée
j'obtiens ççççç et pas 99999"

1) Euh... je pense que tu as voulu dire le contraire !...

2) ce sera ainsi non seulement pour VB mais pour tout !

3) Si j'ai bien compris, tu souhaites faire un programme qui, lancé et tournant constamment en arrière plan, transformerait systématiquement la frappe des touches alphanimériques/numériques en frappe de touches numériques.

Quid alors de la nécessité  d'utiliser réellement la partie "inférieure" de ces touches ?
Il te faudrait alors créer un bouton pour "basculer" d'un état à l'autre ? Mais... c'est exactement le rôle des touches Caps et Capslock ! (alors : un geste ou l'autre, ce sera toujours un geste, non ?)
0
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 4
2 mars 2007 à 07:17
Bonjour,

Merci de t'interesser à ce petit casse-tête.

1) Non je n'ai pas voulu dire le contraire , c'est ce que je constate.

2) Tu as raison, dans la vraie vie, si caps lock est éteinte si tu presse shift + 9 tu obtiens 9,
mais dans mon  exe 
soit  SendKeys "+9"     envoi la même chose que     SendKeys "9",
(en debogage j'obtiens toujours 9)
soit la détection de la touche CapsLock ne fonctionne pas.

3) En fait, j'ai un peu simplifié le code , je reçois d'un lecteur de badge une série de chiffres que je renvoi à la fenêtre active.
çà  fonctionne bien mais uniquement si CapsLock est déactivée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
2 mars 2007 à 07:43
 en majuscules et un çBonjour,

Je ne comprends toujours pas où tu veux en arriver ...

Je vais donc uniquement te répmondre sur ce que je vois !

Sendkeys "+9" envoie 9 en majuscules et non l'appui de la touche capslol puis cette de 9

pour simuler l'appui de Capslock, il faut écrire :
SendKeys "{CAPSLOCK}"

je ne sais pas de quel clavier tu disposes Je pense que tu parles de l'emploi de la touche qui envoie un ç en minuscules

dans ce cas :

SendKeys "{CAPSLOCK}"
SendKeys "ç"

ce qui peut donc également s'écrire : SendKeys "{CAPSLOCK}" & "ç"

enverra un 9 et non un ç

Si c'est ce que tu cherchais, tu aurais pu dire simplement :

"Comment simuler l'emploi de la touche CapsLock ?"
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
2 mars 2007 à 08:11
Je te fais remarquer, toutefois, que le prochain emploi de :
SendKeys "{CAPSLOCK}"
repassera (exactement comme ce serait le cas avec ton doigt) en situalition "normale"

Il te faudra donc gérer en ayant d'abord "regarder" quel est l'état actuel de cette touche de ton clavier et n'envoyer CapsLock que si cette touche n'est pas déjà dans l '"état enfoncé" .... (ce qui est possible, mais... tu te lances là dans la construction d'une usine à gaz assez surprenante...)
0
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 4
2 mars 2007 à 08:36
Je ne veux surtout pas changer l'etat de CapsLock, mais que quelque soit l'état de CapsLock obtenir uniquement 9 et jamais ç

Après avoir lu ta réponse j'ai tenté de remplacer "9" par "ç" et cà fonctionne
    If (GetKeyState(VK_CAPITAL) > 0) Then
        SendKeys "ç", False
    Else
        SendKeys "+ç", False   'envoi de Shift ç
    End If

Evidemment je dois le faire pour tout les chiffres et j'aimerai que çà fonctionne pour les types de claviers.
Une usine à gaz disais-tu ? c'est bien possible, mais je vais tenter de faire plus simple.

Merci en tout cas .
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
2 mars 2007 à 09:09
Je crois que tu devrais plutôt exposer ton problème directement et simplement, sans même parler de Capslock ni de sendkeys.

En exposant très simplement la situation, telle qu'elle se présente, car je ne la vois pas !

Si tu dois envoyer des chiffres par sendkeys, tu peux le faire sans utiliser nécessairement le Capslock !
Si c'est l'utilisateur qui frappe au clavier (donc pas de sendkeys),  dis-nous dans quel contrôe et dans quelles circonstances...
Il se peut enfin que, pour la frappe dans un contrôle de saisie, tu souhaites faciliter la vie de l'utilisateur (d'un portable sans pavé numérique par exemple)...

Enfin bref : si tu nous exposes clairement le problème que tu veux résoudre, nous t'indiquerons la solution la meilleure (il y en a quasiment toujours une).

A toi d'expliquer de sorte à nous mettre en situation de parfaite connaissance de cause.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 mars 2007 à 09:55
Vous retrouverez cette fonction ici :

http://www.codyx.org/snippet_sendchars-envoyer-caracteres-vs-sendkeys_319.aspx

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 4
2 mars 2007 à 10:21
Salut Renfield,

Je vais adopter ta solution, car SendKeys ne prends pas en compte le Shift + chiffre.

En effet:
    SendKeys "+9", False
et
    SendKeys "9", False
renvoient la même chose, soit ç si CapsLock est activé, soit 9 s'il est déactivé.

Merci.
0
Rejoignez-nous