[Trucs & Astuces] VBA/xl/Utiliser les touches F1...F12 d
Je découvre les API et tente de trouver une méthode pour utiliser les touches du clavier afin de me déplacer dans le menu d'une fenêtre créée en API. Pas évident !
J'ai trouvé une adresse (c'est en anglais) qui peut donner des idées :
http://www.awprofessional.com/articles/article.asp?p=366892&seqNum=4&rl=1
Maintenant pour l'utiliser, j'essaie de comprendre (boucle ?, timer ?) . A voir.
A vous de découvrir et bonne chance !
En voici une partie :
Listing 9-9 shows the full code to check for a key press.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| 'Type to hold the coordinates of the mouse pointer
Private Type POINTAPI
x As Long
y As Long
End Type
'Type to hold the Windows message information
Private Type MSG
hWnd As Long 'the window handle of the app
message As Long 'the type of message (e.g. keydown)
wParam As Long 'the key code
lParam As Long 'not used
time As Long 'time when message posted
pt As POINTAPI 'coordinate of mouse pointer
End Type
'Look in the message buffer for a message
Private Declare Function PeekMessage Lib "user32" _
Alias "PeekMessageA" _
(ByRef lpMsg As MSG, ByVal hWnd As Long, _
ByVal wMsgFilterMin As Long, _
ByVal wMsgFilterMax As Long, _
ByVal wRemoveMsg As Long) As Long
'Translate the message from a key code to a ASCII code
Private Declare Function TranslateMessage Lib "user32" _
(ByRef lpMsg As MSG) As Long
Windows API constants
Private Const WM_CHAR As Long = &H102
Private Const WM_KEYDOWN As Long = &H100
Private Const PM_REMOVE As Long = &H1
Private Const PM_NOYIELD As Long = &H2
'Check for a key press
Public Function CheckKeyboardBuffer() As String
'Dimension variables
Dim msgMessage As MSG
Dim hWnd As Long
Dim lResult As Long
'Get the window handle of this application
hWnd = ApphWnd
'See if there are any "Key down" messages
lResult = PeekMessage(msgMessage, hWnd, WM_KEYDOWN, _
WM_KEYDOWN, PM_REMOVE + PM_NOYIELD)
'If so ...
If lResult <> 0 Then
'... translate the key-down code to a character code,
'which gets put back in the message queue as a WM_CHAR
'message ...
lResult = TranslateMessage(msgMessage)
'... and retrieve that WM_CHAR message
lResult = PeekMessage(msgMessage, hWnd, WM_CHAR, _
WM_CHAR, PM_REMOVE + PM_NOYIELD)
'Return the character of the key pressed,
'ignoring shift and control characters
CheckKeyboardBuffer = Chr$(msgMessage.wParam)
End If
End Function |
Traduction globale du commentaire :
Quand nous appuyons sur une touche sur le clavier, la fenêtre active est envoyée à un message de WM_keydown, avec un code de bas niveau pour identifier la clef physique serrée. La première chose que nous devons faire, alors, est d'employer PeekMessage pour regarder dans la file d'attente de message pour voir s'il y a des messages en suspens de WM_keydown, l'enlevant de la file d'attente si nous trouvons un. Si nous trouvions un, nous devons le traduire en code de caractère en utilisant TranslateMessage, de nouveau au lequel envoie le message traduit ont excelé la file d'attente de message comme message de WM_char. Nous alors regardons dans la file d'attente de message pour ce message de WM_char et renvoyons le caractère serré.
Pensez à utiliser les balises de codes SVP -
mieux, à l'identer afin de le rendre plus lisible.