--- Soumis par Lambert Heenan ---
En remplacement de Sendkeys
Le problème avec SendKeys qui modifie l'état du NumLock ( SendKeys causing NumLock to turn off ) est bien connu sous Office et VB. Voici MySendkeys qui peut être utiliser, en remplavement.
Note: 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, celà 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 reformatter votre disque principal. Donc, en définitive, éviter d'utilise SendKey.
'******** Code Start *********** ' 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 '******** Code End ***********