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
- 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
Sub
Lien : 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
Sub
Et 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
Sub
Exemple pour un label nommé "lblDateImp" qui est dans la section "sctEntete" :
Datareport1.Sections
(
"sctEntete"
).controls
(
"lblDateImp"
).caption
=
"Imprimé le "
&
date
Si 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.Show
Placez 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
Sub
Vous 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
Sub
Cette 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
Long
Puis 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
Sub
Appelez 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
Sub
Le 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
Sub
Sous 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
Sub
Les 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
Type
Puis 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
Function
Placez 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
Sub
Voici 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
Long
Cette 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
Integer
Voici 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.