En remplacement de sendkeys

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 071 fois - Téléchargée 42 fois

Contenu du snippet

Généralement, SendKeys n'est pas recommandé dans un environnement de production, car la séquence de clé est interprétée par la fenêtre actuellement active. De toutes évidence, cela peut créer des comportements imprévisible, à tout le moins qu'on peut dire, dans le cas où une autre application recevrait le focus lorsque votre code initie le SendKeys. Un cas extrême est d'envoyer un "Y" à une application qui attendait une confirmation pour reformater votre disque principal. Donc, en définitive, éviter d'utiliser SendKey.

Source / Exemple :


' Déclare un  Type en prévision d'un appel d'API futur
      Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128   '  Maintenance  pour utilisation de  PSS
      End Type

      ' API, déclarations:
      Private Declare Function GetVersionEx Lib "Kernel32" _
         Alias "GetVersionExA" _
         (lpVersionInformation As OSVERSIONINFO) As Long

      Private Declare Sub keybd_event Lib "user32" _
         (ByVal bVk As Byte, _
          ByVal bScan As Byte, _
          ByVal dwflags As Long, ByVal dwExtraInfo As Long)

      Private Declare Function GetKeyboardState Lib "user32" _
         (pbKeyState As Byte) As Long

      Private Declare Function SetKeyboardState Lib "user32" _
         (lppbKeyState As Byte) As Long

      ' Constants,  déclarations:
      Const VK_NUMLOCK = &H90
      Const VK_SCROLL = &H91
      Const VK_CAPITAL = &H14
      Const KEYEVENTF_EXTENDEDKEY = &H1
      Const KEYEVENTF_KEYUP = &H2
      Const VER_PLATFORM_WIN32_NT = 2
      Const VER_PLATFORM_WIN32_WINDOWS = 1

Function IsCapsLockOn() As Boolean
        Dim o As OSVERSIONINFO

        o.dwOSVersionInfoSize = Len(o)
        GetVersionEx o
        Dim keys(0 To 255) As Byte
        GetKeyboardState keys(0)
        IsCapsLockOn = keys(VK_CAPITAL)
End Function

Sub ToggleCapsLock()
        Dim o As OSVERSIONINFO

        o.dwOSVersionInfoSize = Len(o)
        GetVersionEx o
        Dim keys(0 To 255) As Byte
        GetKeyboardState keys(0)

        If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '=====Win95
        'Bascule capslock
            keys(VK_CAPITAL) = Abs(Not keys(VK_CAPITAL))
            SetKeyboardState keys(0)
        ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '=====WinNT
          'Simule  Key Press>
            keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
          'Simule Key Release
            keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY _
               Or KEYEVENTF_KEYUP, 0
        End If
End Sub

Function IsNumLockOn() As Boolean
        Dim o As OSVERSIONINFO
        
        o.dwOSVersionInfoSize = Len(o)
        GetVersionEx o
        Dim keys(0 To 255) As Byte
        GetKeyboardState keys(0)
        IsNumLockOn = keys(VK_NUMLOCK)
End Function

Sub ToggleNumLock()
        Dim o As OSVERSIONINFO
                
        o.dwOSVersionInfoSize = Len(o)
        GetVersionEx o
        Dim keys(0 To 255) As Byte
        GetKeyboardState keys(0)

          If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '=====Win95
                keys(VK_NUMLOCK) = Abs(Not keys(VK_NUMLOCK))
                SetKeyboardState keys(0)
          ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '=====WinNT
          'Simule Key Press
            keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
          'Simule Key Release
            keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY _
               Or KEYEVENTF_KEYUP, 0
          End If
        
End Sub

Function IsScrollLockOn()
        Dim o As OSVERSIONINFO
        
        o.dwOSVersionInfoSize = Len(o)
        GetVersionEx o
        Dim keys(0 To 255) As Byte
        GetKeyboardState keys(0)
        IsScrollLockOn = keys(VK_SCROLL)
End Function

Sub ToggleScrollLock()
        Dim o As OSVERSIONINFO
        
        o.dwOSVersionInfoSize = Len(o)
        GetVersionEx o
        Dim keys(0 To 255) As Byte
        GetKeyboardState keys(0)
        If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '=====Win95
            keys(VK_SCROLL) = Abs(Not keys(VK_SCROLL))
            SetKeyboardState keys(0)
        ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '=====WinNT
            'Simule Key Press
            keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
            'Simule Key Release
            keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
        End If
End Sub

Sub mySendKeys(sKeys As String, Optional bWait As Boolean = False)
Dim bNumLockState As Boolean
Dim bCapsLockState As Boolean
Dim bScrollLockState As Boolean
    bNumLockState = IsNumLockOn()
    bCapsLockState = IsCapsLockOn()
    bScrollLockState = IsScrollLockOn()
    SendKeys sKeys, bWait
    If IsNumLockOn() <> bNumLockState Then
        ToggleNumLock
    End If
    If IsCapsLockOn() <> bCapsLockState Then
        ToggleCapsLock
    End If
    If IsScrollLockOn() <> bScrollLockState Then
        ToggleScrollLock
    End If
End Sub

Function fSendKeys(sKeys As String, Optional bWait As Boolean = False)
' En faire une fonction, qu'on puisse l'appeler à partir de macro
    mySendKeys sKeys, bWait
End Function

Conclusion :


Auteur : Dev Ashish

A voir également

Ajouter un commentaire

Commentaires

devsurf
Messages postés
148
Date d'inscription
dimanche 13 octobre 2002
Statut
Membre
Dernière intervention
13 novembre 2008
-
Salut
Moi aussi, je cherche une alternative pour SENDKEY car j'un problème justement sur le copier/coller
si vous avez une idée, voir le lien vers ma question plus bas.

Sinon, en ce qui concerne le point soulevé par NeoTOTO, moi j'utilise une fonction VBA nommée AppActivate pour pointer sur un process (meme groupe que SendKey)

syntaxe: AppActivate NoProcess
Exemple AppActivate 5896

Le numero process est de type LONG qu'on doit récuperer de l'application concernée.

Exemple de mon code source:
(hprocess contient le numero de mon process Word)

'Mise en forme de la variable sélectionnée
strVariable = "blabla"

'Copie dans l'applicatif
Clipboard.Clear
SendKeys "^c", True
Clipboard.SetText strVariable

AppActivate hProcess
SendKeys "^v", True

Voila....
a+
n.b.
Si vous avez une reponse sur ma question ci dessous , ca serait sympa
http://www.vbfrance.com/forum/sujet-PROBLEME-SUR-SENDKEYS-SENDKEYS-WORD-2003_1228335.aspx

a+
NeoToto
Messages postés
11
Date d'inscription
vendredi 29 novembre 2002
Statut
Membre
Dernière intervention
15 mai 2006
-
Et juste pour rendre a César ce qui lui revient, l'original de cette source est à http://www.mvps.org/accessfr/apis/api0046.htm
NeoToto
Messages postés
11
Date d'inscription
vendredi 29 novembre 2002
Statut
Membre
Dernière intervention
15 mai 2006
-
Et juste pour rendre a César ce qui lui revient, l'original de cette source est à http://www.mvps.org/accessfr/apis/api0046.htm
NeoToto
Messages postés
11
Date d'inscription
vendredi 29 novembre 2002
Statut
Membre
Dernière intervention
15 mai 2006
-
Désolé, mais je vois pas l'interet : En quoi est ce que cette "encapsulation" du sendkeys empeche la perte du focus ? Un alt + tab mal placé, et on retombe sur le meme probleme.....

Je cherche en vain une solution pour envoyer du sendkeys vers un hwnd spécifique... Si quelqu'un sait.....
shadowmoy
Messages postés
340
Date d'inscription
jeudi 25 juillet 2002
Statut
Membre
Dernière intervention
25 août 2007
-
excellent code un 10/10 pour la peine na !!!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.