FAQ Visual Basic

FAQ Visual Basic Consultez toutes les FAQ
Nombre d'auteurs : 50, nombre de questions : 300, dernière mise à jour : 15 juin 2021
Sommaire→Interface→Divers- Comment faire un écran d'accueil (splash screen) ?
- Peut-on changer la police ou la couleur du texte avec MsgBox ?
- Comment faire une barre de progression ?
- Comment modifier le texte d'un rptLabel dans un datareport ?
- Comment afficher un DataReport en mode paysage ?
- Comment faire défiler un ensemble de contrôles avec un ascenseur ?
- Comment mettre des images dans un menu ?
- Comment mettre les éléments de mon menu sur plusieurs colonnes ?
- Comment faire du Drag and Drop ?
- Comment récupérer les coordonnées de la souris ?
- Comment simuler un clic de souris ?
- Comment insérer une image au format gif animée ?
- Qu'est-ce que le sous classement ?
- Comment compiler un ou plusieurs projets VB6 à partir d'une autre application VB6 ?
- Comment détecter l'action sur une touche ?
Si au lancement de votre application, une fenêtre ne s'affiche pas instantanément, cela donnera une impression de lourdeur et de lenteur d'exécution à l'utilisateur. Le chargement de la fenêtre principale d'un programme pouvant être relativement long, il est courant d'afficher un écran d'accueil, qui apparaît immédiatement, et qui reste visible pendant le chargement du reste du programme.
Nous allons créer une procédure Main qui sera chargée :
- d'afficher l'écran d'accueil
- d'afficher la fenêtre principale
- de fermer l'écran d'accueil après un délai à spécifier
Le délai sert à laisser l'écran d'accueil visible au moins quelques secondes, même dans le cas où l'ouverture de la fenêtre principale serait quasi instantanée.
Pour créer l'écran d'accueil, ajoutez une form au projet et nommez-la frmSplash. Enlevez sa barre de titre en donnant la valeur False à la propriété ControlBox et en ne mettant aucun texte dans la propriété Caption. Vous pouvez aussi, si vous le souhaitez, enlever la bordure de la fenêtre en donnant la valeur 0 à la propriété BorderStyle. Donnez la valeur 2 à la propriété StartUpPosition. Posez ensuite un timer et nommez-le "tmr". Puis collez ce code source dans le module de la feuille :
Dim sec As Long
Dim delai As Long
Private Sub Form_Load()
tmr.Enabled = False
tmr.Interval = 1000
sec = 0
AuSommet Me.hwnd
End Sub
Public Sub CloseAfter(ByVal attente As Long)
tmr.Enabled = True
delai = attente
End Sub
Private Sub tmr_Timer()
sec = sec + 1
Me.Print sec
If sec >= delai Then Unload Me
End Sub]Dans la procédure Form_Load, l'appel à la fonction AuSommet permet de spécifier que cette form doit toujours se trouver au premier plan. Ainsi elle ne sera pas cachée par la fenêtre principale. Ajoutez une autre form au projet et nommez-la frmMain. Placez enfin ce code dans un module standard :
Private Const SWP_NOMOVE = 2
Private Const SWP_NOSIZE = 1
Private Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1
Private Declare Function SetWindowPos Lib "USER32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
Public Function AuSommet(hwnd As Long) As Long
AuSommet = SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
End Function
Sub Main()
frmSplash.Show
DoEvents
frmMain.Show
'fermeture au bout de 2 secondes
frmSplash.CloseAfter 2
End SubLien : Projet VB à télécharger
Non. Vous devrez donc programmer vos propres boîtes de message avec une form qui aura la valeur fixedSingle à la propriété BorderStyle pour qu'elle ne soit pas redimensionnable, et la valeur CenterScreen pour StartUpPosition.
Voici deux solutions : la faire vous même avec un PictureBox, ou utiliser le contrôle ProgressBar contenu dans le composant Microsoft Windows Common Controls 6.0. Voyons un exemple illustrant la première méthode; posez un PictureBox et un timer sur une form, et placez ce code dans le module de la form :
Dim niveau as long, max as long
Private Sub Form_Load()
max = 100 'valeur maximale du niveau
niveau = 0 'valeur initiale
Timer1.Interval = 200
Picture1.Width = 5000
Picture1.Height = 280
End Sub
Private Sub Timer1_Timer()
niveau = niveau + 1
If niveau = max Then Timer1.Enabled = False
Picture1.Line (0, 0)-(niveau * Picture1.ScaleWidth / max, Picture1.ScaleHeight), vbBlue, BF
End SubEt maintenant voici l'équivalent avec le contrôle ProgressBar. Posez sur une form un timer et un contrôle ProgressBar, et placez ce code dans le module de la form :
Private Sub Form_Load()
ProgressBar1.min = 0
ProgressBar1.max = 100
ProgressBar1.Value = 0
Timer1.Interval = 200
End Sub
Private Sub Timer1_Timer()
ProgressBar1.Value = ProgressBar1.Value + 1
If ProgressBar1.Value >= ProgressBar1.max Then Timer1.Enabled = False
End SubExemple pour un label nommé "lblDateImp" qui est dans la section "sctEntete" :
Datareport1.Sections("sctEntete").controls("lblDateImp").caption = "Imprimé le " & dateSi vous n'avez pas installé le Service Pack 4 ou une version ultérieure pour Microsoft Visual Studio 6, le DataReport utilise la configuration de l'imprimante par défaut pour choisir entre le mode portrait et le mode paysage. Les Service Packs 4 et supérieurs contiennent une mise à jour de l'objet DataReport, qui possède une nouvelle propriété appelée Orientation. Le code suivant utilise cette propriété afin d'afficher un DataReport en mode paysage :
DataReport1.Orientation = rptOrientLandscape
DataReport1.ShowPlacez sur une form une frame nommée Frame1. Sélectionnez-la, et placez dans cette frame une autre frame, nommée Frame2.
Frame1 doit être le conteneur de Frame2 et la hauteur de Frame2 doit être supérieure à celle de Frame1. Mettez la propriété Top de Frame2 à 0. Puis placez les contrôles qui devront défiler dans Frame2. Enfin ajoutez ce code dans le module de la form :
Private Sub Form_Load()
VScroll1.Min = 0
VScroll1.Max = Frame2.Height - Frame1.Height
End Sub
Private Sub VScroll1_Change()
Frame2.Top = -VScroll1.Value
End Sub
Private Sub VScroll1_Scroll()
VScroll1_Change
End SubVous pouvez aussi utiliser des PictureBox, mais les frames consomment moins de ressources.
L'éditeur de menus de Visual Basic ne permet pas d'ajouter une image pour un menu. Voici une façon de le faire.
Copiez ces déclarations dans un module standard :
Public Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Public Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long, _
ByVal hBitmapUnchecked As Long, _
ByVal hBitmapChecked As Long) As Long
Public Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Public Const MF_BYPOSITION = &H400&Vos images seront de préférence des gifs transparentes. Vous pouvez les stocker par exemple dans un contrôle ImageList. Pour cela, ajoutez le composant « Microsoft Windows Common Controls 6.0 » à votre projet. Déposez un contrôle ImageList sur votre form. Faites un clic droit sur le contrôle ImageList et cliquez sur le menu Propriétés. La fenêtre qui s'est ouverte vous permet d'insérer vos images.
Le code qui ajoute les images aux menus est à placer dans la procédure Form_Load() de la form. L'exemple ci-dessous traite les deux premiers menus d'une form, qui sont typiquement les menus Fichier et Edition.
Private Sub Form_Load()
Dim hMenu As Long, hSousMenu As Long, menuId As Long
hMenu = GetMenu(Me.hwnd)
hSousMenu = GetSubMenu(hMenu, 0) 'handle du menu Fichier
SetMenuItemBitmaps hSousMenu, 0, MF_BYPOSITION, ImageList1.ListImages(1).Picture, 0 'ouvrir
SetMenuItemBitmaps hSousMenu, 1, MF_BYPOSITION, ImageList1.ListImages(2).Picture, 0 'enregistrer
SetMenuItemBitmaps hSousMenu, 2, MF_BYPOSITION, ImageList1.ListImages(3).Picture, 0 'imprimer
hSousMenu = GetSubMenu(hMenu, 1) 'handle du menu Edition
SetMenuItemBitmaps hSousMenu, 0, MF_BYPOSITION, ImageList1.ListImages(4).Picture, 0 'annuler
SetMenuItemBitmaps hSousMenu, 1, MF_BYPOSITION, ImageList1.ListImages(5).Picture, 0 'couper
SetMenuItemBitmaps hSousMenu, 2, MF_BYPOSITION, ImageList1.ListImages(6).Picture, 0 'copier
SetMenuItemBitmaps hSousMenu, 3, MF_BYPOSITION, ImageList1.ListImages(7).Picture, 0 'coller
End SubCette méthode a malheureusement un inconvénient : les couleurs sont mal respectées, et vos images auront un aspect anormalement foncé. Une autre méthode, beaucoup plus compliquée et réservée aux programmeurs avancés, est utilisée dans ce projet.
Il ne s'agit pas ici de sous-menus à un deuxième niveau, comme ceux du menu "Zoom" de l'éditeur de Visual Basic, mais bien de mettre les sous-menus sur plusieurs colonnes.
Dans le module d'une form, copiez d'abord ces déclarations dans la partie Générale :
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" _
(ByVal hMenu As Long, ByVal wIDItem As Long, _
ByVal lpString As String, ByVal nMaxCount As Long, _
ByVal wFlag As Long) As Long
Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" _
(ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long, ByVal wIDNewItem As Long, _
ByVal lpString As Any) As LongPuis copiez cette procédure :
Private Sub MenuSurPlusieursColonnes(handle As Long, numeroDuMenu As Integer, _
nbEltsParColonnes As Integer)
Dim hMenu As Long, hSubMenu As Long
Dim mnuItemCount As Long, mnuItemID As Long, mnuItemText As String
Dim compteur As Integer, Resultat As Long, Buffer As String
If nbEltsParColonnes < 1 Then Exit Sub
If nbEltsParColonnes < 0 Then Exit Sub
hMenu = GetMenu(handle) 'Handle du menu de la feuille
hSubMenu = GetSubMenu(hMenu, numeroDuMenu) 'Handle du sous menu désiré
mnuItemCount = GetMenuItemCount(hSubMenu) 'Nombre d'éléments dans le sous menu
'On règle le pas et le compteur pour le nombre d'éléments par colonne
For compteur = nbEltsParColonnes + 1 To mnuItemCount Step nbEltsParColonnes
Buffer = Space$(256)
Resultat = GetMenuString(hSubMenu, compteur - 1, Buffer, Len(Buffer), &H400&)
mnuItemText = Left$(Buffer, Resultat)
mnuItemID = GetMenuItemID(hSubMenu, compteur - 1)
Call ModifyMenu(hSubMenu, compteur - 1, &H400& Or &H20&, mnuItemID, mnuItemText)
Next compteur
End SubAppelez simplement la procédure pour chacun des menus à modifier :
Private Sub Form_Load()
MenuSurPlusieursColonnes Me.hwnd, 0, 5 '5 éléments par colonne pour le premier menu
MenuSurPlusieursColonnes Me.hwnd, 1, 8 '8 éléments par colonne pour le deuxième menu
End SubLe DragDrop doit être vu comme un artifice visuel. Pour schématiser, rien n'est déplacé lors d'une opération DragDrop. C'est votre code qui va générer le "déplacement". Cette opération existe sous deux formes :
- La forme standard pour les opérations de déplacement au sein d'un process
- La forme OLE, qui rend possible les déplacements inter process.
La forme standard est assez simple d'utilisation. On active l'opération dans l'événement MouseMove du contrôle source, on gère les icônes dans l'(es) événement(s) DragOver des contrôles de la feuille, et enfin on effectue le déplacement dans l'événement DragDrop du contrôle cible. L'exemple suivant permet d'échanger des éléments entre deux contrôles Listbox.
Private Sub Form_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
If Source Is List1 Then
Source.DragIcon = _
LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Misc\misc06.ico")
End If
End Sub
Private Sub List1_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
If (Source Is List1) Or (Source Is List2) Then
Source.DragIcon = _
LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Dragdrop\drop1pg.ico")
End If
End Sub
Private Sub List2_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
If (Source Is List1) Or (Source Is List2) Then
Source.DragIcon = _
LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Dragdrop\drop1pg.ico")
End If
End Sub
Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
List1.Drag vbBeginDrag
End Sub
Private Sub List2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
List2.Drag vbBeginDrag
End Sub
Private Sub List1_DragDrop(Source As Control, X As Single, Y As Single)
If Source Is List2 Then
List1.AddItem List2.List(List2.ListIndex)
List2.RemoveItem List2.ListIndex
End If
End Sub
Private Sub List2_DragDrop(Source As Control, X As Single, Y As Single)
If Source Is List1 Then
List2.AddItem List1.List(List1.ListIndex)
List1.RemoveItem List1.ListIndex
End If
End SubSous sa forme OLE, le drag and drop peut être beaucoup plus complexe. Bien qu'identique dans la forme de programmation, les données peuvent être transmises entre les applications. Dans l'exemple suivant, vous pouvez déplacer un fichier graphique en partant de l'explorateur vers votre PictureBox.
Private Sub Form_Load()
'autorise les opérations manuelles de dépose
Picture1.OLEDropMode = vbOLEDropManual
End Sub
Private Sub Picture1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, _
Shift As Integer, X As Single, Y As Single)
Dim NomFichier As String
'vérifie le format de l'objet Data Transmis
If Data.GetFormat(vbCFFiles) = True Then
' vbCFFiles correspond à une liste de fichier, donc récupération du premier élément
NomFichier = Data.Files(1)
On Error GoTo invalidPicture
Picture1.Picture = LoadPicture(NomFichier)
End If
Exit Sub
invalidPicture:
MsgBox "Format de fichier incorrect", vbCritical + vbOKOnly
End Sub
Private Sub Picture1_OLEDragOver(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, _
X As Single, Y As Single, State As Integer)
'vérifie le format de l'objet Data Transmis pour valoriser le paramètre Effect
If Data.GetFormat(vbCFFiles) Then
Effect = vbDropEffectCopy And Effect
Else
Effect = vbDropEffectNone
End If
End SubLes procédures des évènements MouseDown, MouseMove et MouseUp reçoivent les coordonnées de la souris dans les paramètres X et Y. L'origine utilisée est le coin haut gauche du contrôle concerné. Les coordonnées sont exprimées dans l'unité spécifiée dans la propriété ScaleMode pour les contrôles conteneurs, et toujours en twips pour les autres.
Pour les autres évènements, par exemple Click ou DblClick, les coordonnées se récupèrent via les API Windows. Copiez ces déclarations au début du module de la form :
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Private Type POINTAPI
X As Long
Y As Long
End TypePuis la fonction ci-dessous, qui renvoie les coordonnées de la souris exprimées en twips, par rapport au coin haut gauche de la form :
Private Function GetMousePosition() As POINTAPI
Dim pos As POINTAPI
GetCursorPos pos
ScreenToClient Me.hwnd, pos
pos.X = Screen.TwipsPerPixelX * pos.X
pos.Y = Screen.TwipsPerPixelY * pos.Y
GetMousePosition = pos
End FunctionPlacez ce code dans un module standard. La procédure Clic simule un clic de souris. Les paramètres à passer sont les coordonnées en pixels.
Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, _
ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_MOVE = &H1
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN = &H8
Public Const MOUSEEVENTF_RIGHTUP = &H10
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20
Public Const MOUSEEVENTF_MIDDLEUP = &H40
Public Const MOUSEEVENTF_ABSOLUTE = &H8000
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Type POINTAPI
x As Long
y As Long
End Type
Public dstX As Long
Public dstY As Long
Public Function GetX() As Long
Dim n As POINTAPI
GetCursorPos n
GetX = n.x
End Function
Public Function GetY() As Long
Dim n As POINTAPI
GetCursorPos n
GetY = n.y
End Function
Public Sub Clic(PosX As Integer, PosY As Integer)
'placer la souris par sécurité (pour processeurs lents)
Call SetCursorPos(PosX, PosY)
mouse_event MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, PosX, PosY, 0, 0
End SubVoici un composant gratuit très simple d'emploi : gif89.zip.
Il suffit d'extraire le fichier d'extension .dll dans le répertoire windows\system, puis de l'ajouter dans les composants du projet. Vous aurez alors un nouveau contrôle dans la boîte à outils. Pour afficher une image, vous pouvez indiquer le chemin du fichier à la propriété filename en mode conception ou lors de l'exécution.
Sous Windows, tous les contrôles et toutes les fenêtres sont attachés à une fonction, que l'on appelle "procédure de fenêtre", et qui est chargée de traiter tous les messages reçus par cette fenêtre. Voici sa déclaration en VB :
Public Function WindowProc(ByVal hwnd As Long, ByVal msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As LongCette fonction est donc exécutée chaque fois qu'une fenêtre qui lui est attachée reçoit un message. VB utilise ce genre de fonction pour nous signaler qu'un évènement a lieu en lançant la procédure évènementielle que l'on a déclarée, par exemple Form_Load.
Mais de nombreux événements pouvant parfois être utiles au programmeur n'ont pas été repris dans Visual Basic. C'est ici qu'intervient le sous classement - en anglais subclassing - : nous attachons à un contrôle ou à la form notre propre procédure afin d'intercepter l'évènement qui nous intéresse.
Exemples d'utilisation du sous classement :
Un projet VB6 (.vbp, .vbg) est compilable en ligne de commande.
Le principe : créer un tableau contenant le ou les chemins complets du ou des projets à compiler. Lancer la procédure de compilation,
qui va, elle-même, exécuter ces tâches successivement (Sub ExecuteTache), afin d'éviter les erreurs de compilation multiples et simultanées.
Nota : tous les projets à compiler doivent être fermés, et les fichiers exécutables associés, non utilisés (faute de quoi ils ne pourront être écrasés).
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Const STILL_ACTIVE = &H103
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const C_COMMANDLINECOMPILE As String = """C:\Program Files\Microsoft Visual Studio\VB98\vb6.exe"" /make "
Private Sub ExecuteTache(ByVal Tache As String, Optional ModShell As Variant)
' ---Cette fonction crée une tache puis regarde si elle est active---
Dim hProcess As Long
Dim RetVal As Long
' ---Ouvre un programme et récupère son handle (hProcess)---
On Error GoTo errShell
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, _
Shell(Tache, IIf(IsMissing(ModShell), vbMinimizedNoFocus, ModShell)))
On Error GoTo 0
' ---Regarde si le processus est actif---
Do
' Retourne le status du processus en cours
GetExitCodeProcess hProcess, RetVal
' Les 2 lignes suivantes sont recommandées pour éviter de faire
' travailler le système avec GetExitCodeProcess
DoEvents
Sleep 200
Loop While RetVal = STILL_ACTIVE
CloseHandle (hProcess)
Debug.Print "Tache exécutée"
Exit Sub
errShell:
msg = "Erreur " & Err.Number & " : " & Err.Description & vbLf & _
"Programme concerné : " & Tache
MsgBox msg, vbOKOnly + vbCritical, "Lancement de la tâche impossible"
End Sub
Private Sub Compile(Projects() As String)
Dim i As Integer
Screen.MousePointer = vbHourglass
For i = 0 To UBound(Projects)
cmd = C_COMMANDLINECOMPILE & Projects(i)
Debug.Print cmd
ExecuteTache cmd
Next i
Screen.MousePointer = vbDefault
End Sub
Private Sub Command1_Click()
Dim ProjetACompiler(1) As String
ProjetACompiler(0) = """C:\VB6toto\Projet1.vbp"""
ProjetACompiler(1) = """C:\VB6titi\Projet1.vbp"""
Compile ProjetACompiler()
End Sub
Pour capturer certaines touches comme la touche "Suppr" l'utilisation de l'événement keypress, ne suffit pas, une solution est l'utilisation de l'API GetAsyncKeyState
déclarer l'API GetAsyncKeyState :
Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As IntegerVoici en exemple, une boucle qui s'interrompt avec une action sur la touche Suppr :
'Boucle tant que touche Suppr pas actionnée..
While GetAsyncKeyState(&H2E) = 0
DoEvents
Wend
MsgBox "FIN"Liste des constantes utilisables :
- VK_F9 78 Touche f9
- VK_F8 77 Touche f8
- VK_F6 75 Touche f6
- VK_F7 76 Touche f7
- VK_F5 74 Touche f5
- VK_F4 73 Touche f4
- VK_F3 72 Touche f3
- VK_F2 71 Touche f2
- VK_F1 70 Touche f1
- VK_DIVIDE 6F Touche "division".
- VK_DECIMAL 6E Touche séparateur décimal.
- VK_SUBTRACT 6D Touche "soustraction".
- VK_SEPARATOR 6C Touche de séparation.
- VK_ADD 6B Touche "addition".
- VK_MULTIPLY 6A Touche "multiplication".
- VK_NUMPAD9 69 Touche 9 (clavier numérique).
- VK_NUMPAD8 68 Touche 8 (clavier numérique).
- VK_NUMPAD7 67 Touche 7 (clavier numérique).
- VK_NUMPAD6 66 Touche 6 (clavier numérique).
- VK_NUMPAD5 65 Touche 5 (clavier numérique).
- VK_NUMPAD4 64 Touche 4 (clavier numérique).
- VK_NUMPAD3 63 Touche 3 (clavier numérique).
- VK_NUMPAD2 62 Touche 2 (clavier numérique).
- VK_NUMPAD1 61 Touche 1 (clavier numérique).
- VK_NUMPAD0 60 Touche 0 (clavier numérique).
- VK_APPS 5D Touche Windows applications (Microsoft Natural Keyboard).
- VK_RWIN 5C Touche Windows droite (Microsoft Natural Keyboard).
- VK_LWIN 5B Touche Windows gauche (Microsoft Natural Keyboard).
- VK_Z 5A Touche z
- VK_Y 59 Touche y
- VK_X 58 Touche x
- VK_W 57 Touche w
- VK_V 56 Touche v
- VK_U 55 Touche u
- VK_T 54 Touche t
- VK_S 53 Touche s
- VK_R 52 Touche r
- VK_Q 51 Touche q
- VK_P 50 Touche p
- VK_O 4F Touche o
- VK_N 4E Touche n
- VK_M 4D Touche m
- VK_L 4C Touche l
- VK_K 4B Touche k
- VK_J 4A Touche j
- VK_I 49 Touche i
- VK_H 48 Touche h
- VK_G 47 Touche g
- VK_F 46 Touche f
- VK_E 45 Touche e
- VK_D 44 Touche d
- VK_C 43 Touche c
- VK_B 42 Touche b
- VK_A 41 Touche a
- VK_9 39 Touche 9
- VK_8 38 Touche 8
- VK_7 37 Touche 7
- VK_5 35 Touche 5
- VK_6 36 Touche 6
- VK_3 33 Touche 3
- VK_4 34 Touche 4
- VK_1 31 Touche 1
- VK_2 32 Touche 2
- VK_0 30 Touche 0
- VK_HELP 2F Touche "aide".
- VK_DELETE 2E Touche "Suppression".
- VK_INSERT 2D Touche insertion.
- VK_SNAPSHOT 2C Touche impression écran.
- VK_EXECUTE 2B Touche "exécution".
- VK_SELECT 29 Touche "selection".
- VK_DOWN 28 Flèche curseur bas.
- VK_RIGHT 27 Flèche curseur droit.
- VK_UP 26 Flèche curseur haut.
- VK_LEFT 25 Flèche curseur gauche.
- VK_HOME 24 Touche "début".
- VK_END 23 Touche "fin".
- VK_NEXT 22 Touche "page bas".
- VK_PRIOR 21 Touche "page haut".
- VK_SPACE 20 Touche Espace.
- VK_ESCAPE 1B Touche Echap.
- VK_CAPITAL 14 Touche verrouillage majuscule.
- VK_PAUSE 13 Touche "Pause".
- VK_MENU 12 Touche "Alt".
- VK_CONTROL 11 Touche "Control".
- VK_SHIFT 10 Touche "Shift".
- VK_RETURN 0D Touche "Entrée".
- VK_CLEAR 0C Touche d'effacement.
- VK_TAB 09 Touche tabulation.
- VK_BACK 08 Touche retour arrière.
- VK_MBUTTON 04 Bouton du milieu de la souris (le 3ème boutton).
- VK_CANCEL 03 Control-break.
- VK_RBUTTON 02 Bouton droit de la souris.
- VK_LBUTTON 01 Bouton gauche de la souris.
- VK_F10 79 Touche f10
- VK_F11 7A Touche f11
- VK_F12 7B Touche f12
- VK_F13 7C Touche f13
- VK_F14 7D Touche f14
- VK_F15 7E Touche f15
- VK_F16 7F Touche f16
- VK_F17 80H Touche f17
- VK_F18 81H Touche f18
- VK_F19 82H Touche f19
- VK_F20 83H Touche f20
- VK_F21 84H Touche f21
- VK_F22 85H Touche f22
- VK_F23 86H Touche f23
- VK_F24 87H Touche f24
- VK_NUMLOCK 90 Touche verrouillage numérique.
- VK_SCROLL 91 Touche verrouillage défilement.
- VK_ATTN F6 Touche "Attn".
- VK_CRSEL F7 Touche "CrSel".
- VK_EXSEL F8 Touche "ExSel".
- VK_PLAY FA Touche "Play".
- VK_ZOOM FB Touche "Zoom".
- VK_NONAME FC Reservé.
- VK_PA1 FD Touche PA1.



