XL 2016 VBA SendKeys - Que se passe-t-il sur le verrouillage numérique des PC et Mac ?

Dudu2

XLDnaute Barbatruc
Bonjour,

En VBA, je connnais 3 façons de faire un SendKeys.
Celui qui semble le plus sûr est un SendKeys via un Shell, mais il a aussi l'inconvénient de provoquer parfois des interruptions de code.
Les 2 autres ont un impact sur le verrouillage numérique (touche en haut à gauche du clavier numérique).

Sur mon PC, je peux constater l'impact des 2 autres, mais j'aimerais savoir pour d'autres PC ou MAC.
1621065747837.png


Merci par avance pour vos retours (si vous avez un voyant Num Lock pour juger de l'effet).
 

Pièces jointes

  • Classeur1.xlsm
    18.8 KB · Affichages: 56
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@mapomme

attention : AVANT de demander le remboursement de ton clavier actuel, essaye D'ABORD de voir si tu en trouves un autre qui te convient : ce serait bête de rendre ton clavier et que finalement tu le regrettes car tu n'aurais pas trouvé mieux. ;)

soan
 

chris

XLDnaute Barbatruc
Bonjour à tous
Malheureusement, j'ai acheté un clavier rétroéclairé de chez Logitech qui n'a pas de LED de verrouillage du clavier numérique o_O. Je ne me suis même pas douté que ça pouvait être le cas.
C'est inconcevable qu'un clavier (à un tarif aussi élevé) ne possède pas ce témoin.
Autant je partage ton avis pour les portables, autant sur un clavier standard, sauf fausse manip, on ne désactive pas le pavé...
En revanche je supporte mal l'économie sur le verrouillage majuscules...

Je n'ai pas d'actions chez eux mais, que ce soit les claviers ou les souris, c'est les seuls qui m'aient duré longtemps et Logitech a même échangé, sans sourciller contre une neuve, une souris épuisée par un gamer forcené près de 3 ans après l'achat.
Mais la qualité baisse, comme la durée de garantie passé à 2 ans, et j'achète par précaution les fins de stock de modèles plus anciens...
 

Dudu2

XLDnaute Barbatruc
@MJ13, merci pour ton fichier.
En fait c'est très compliqué, et dépend même du fait qu'on ajoute ", True" ou pas.

Par exemple, sur mon PC, le fonctionnement transparent de SendKeys et impactant de Application.Sendkeys est exactement inversé si j'envoie du {NUMLOCK} entre temps !

Autre exemple, la récupération de l'état du Num Lock par GetKeyState() ne donne pas le bon résultat après un SendKeys. Il faut ajouter ", True" pour avoir le bon résultat !

Donc c'est un truc totalement incontrôlable. Pour moi les seules solutions valides sont:
VB:
Sub SendKeys1()
    CreateObject("wscript.shell").SendKeys ("{ENTER}{UP}")
End Sub
ou
Code:
#If VBA7 Then
    Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#Else
    Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#End If

Sub SendKeys2()
    Dim NumLock As Boolean
 
    NumLock = IsNumLock
 
    SendKeys "{ENTER}{UP}", True
 
    If NumLock <> IsNumLock Then
        'MsgBox "Correction NUMLOCK"
        SendKeys "{NUMLOCK}", True
    End If
End Sub

Private Function IsNumLock() As Boolean
    Const VK_NUMLOCK = &H90 ' ou 144
 
    If GetKeyState(VK_NUMLOCK) = 0 Then IsNumLock = True
End Function
Ou
Code:
#If VBA7 Then
    Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#Else
    Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#End If

Sub SendKeys3()
    Dim NumLock As Boolean
 
    NumLock = IsNumLock
 
    Application.SendKeys "{ENTER}{UP}", True
 
    If NumLock <> IsNumLock Then
        'MsgBox "Correction NUMLOCK"
        Application.SendKeys "{NUMLOCK}", True
    End If
End Sub

Private Function IsNumLock() As Boolean
    Const VK_NUMLOCK = &H90 ' ou 144
 
    If GetKeyState(VK_NUMLOCK) = 0 Then IsNumLock = True
End Function
 

Pièces jointes

  • VBA SendKeys 3 méthodes.xlsm
    19.7 KB · Affichages: 1
Dernière édition:

Dudu2

XLDnaute Barbatruc
@Usine à gaz, oui mais comme je l'ai dit au début, dans un de mes codes, cette version provoque de temps à autres une interruption du code VBA car j'envoie un {ESC}. Après l'interruption, l'instruction immédiatement suivante est surlignée en jaune (en l'occurrence un End Sub).
Je n'ai pas ce problème avec un SendKeys direct.
Je reconnais que c'est un cas très particulier mais je dois l'adresser.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @soan,
et bonjour à tous et tous les autres :)

@chris,
Oui mais quelquefois avec mes gros doigts qui trainent partout ou un sendkeys hasardeux, ça le fait. Et quand c'est à la saisie d'un mot de passe sans possibilité de voir ce qu'on tape, c'est très gênant.


Pour le logiciel évoqué par @soan, j'ai trouvé le logiciel à:
https://www.logitech.fr/fr-fr/product/options#notification-status
(comment n'y ai-je pas pensé plus tôt !!!!)
Voici ce qu'il affiche sur l'écran quand appuie sur la touche "Verr Num" :
 

Pièces jointes

  • Verrou-oui.jpg
    Verrou-oui.jpg
    189 KB · Affichages: 20
  • Verrou-non.jpg
    Verrou-non.jpg
    212.2 KB · Affichages: 19
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
@Usine à gaz, oui mais comme je l'ai dit au début, dans un de mes codes, cette version provoque de temps à autres une interruption du code VBA car j'envoie un {ESC}. Après l'interruption, l'instruction immédiatement suivante est surlignée en jaune (en l'occurrence un End Sub).
Je n'ai pas ce problème avec un SendKeys direct.
Je reconnais que c'est un cas très particulier mais je dois l'adresser.
Curieux :
Cher moi aucun souci depuis des mois avec CreateObject("wscript.shell").SendKeys ("{ENTER}")
et le SendKeys direct désactive mon pavé numérique !
Va comprendre ? lol
 

Dudu2

XLDnaute Barbatruc
@Usine à gaz,

La version CreateObject("wscript.shell").SendKeys ("{ENTER}") marche très bien sauf si ce qu'on envoie contient {ESC} ce qui est le cas que je voulais adresser. Car de temps à autres (assez rares mais pas rarissimes) cela provoque une interruption du code.

Des 3 versions:
1 - CreateObject("wscript.shell").SendKeys ("{ESC}")
2 - SendKeys ("{ESC}")
3 - Application.SendKeys ("{ESC}")
Seule la 2ème ne provoque pas d'interruption du code.

Ce fichier le démontre (sur mon PC en tous cas)
Cliquer sur:
1621079396630.png

qui active le code:
VB:
Sub TestSendKeysEscape()
    Dim i As Integer
 
    For i = 1 To 1000
        Call SendKeys1("{ESC}") 'Provoque une interruption du code
        'Call SendKeys2("{ESC}")
        'Call SendKeys3("{ESC}") 'Provoque une interruption du code
        DoEvents
    Next i
 
    MsgBox "Terminé."
End Sub
 

Pièces jointes

  • VBA SendKeys 3 méthodes.xlsm
    21.5 KB · Affichages: 3
Dernière édition:

Statistiques des forums

Discussions
315 065
Messages
2 115 866
Membres
112 602
dernier inscrit
annouara