| auteurs : Geronimo, Ricky81 | Prenons l'exemple de la surveillance de l'écriture dans un TEdit et intéressons nous à l'évènement OnKeyDown :
void __fastcall Edit1KeyDown (TObject * Sender, WORD & Key, TShiftState Shift);
|
Nous allons utiliser la fonction GetKeyState qui permet non seulement de savoir si une touche est enfoncée, mais également de savoir si celle-ci est bloquée. Pour cela, il faut examiner de plus près la valeur renvoyée par cette fonction : elle renvoie un SHORT. Le bit de poids le plus fort est à 1 si la touche est enfoncée et le bit de poids le plus faible est à 1 si la touche est verrouillée. Le code suivant permet donc de tester le verrouillage ou non du NumLock :
void __fastcall TForm1:: Edit1KeyDown (TObject * Sender, WORD & Key, TShiftState Shift)
{
if (Key = = VK_NUMLOCK)
{
if ((GetKeyState (VK_NUMLOCK) & 1 ) = = 1 )
{
ShowMessage (" NumLock vient d'être verrouillé ! " );
}
}
}
|
|
lien : Comment tester l'état d'un bouton ou d'une touche ?
|
| auteur : Geronimo | Utilisez pour cela la fonction GetCursorPos qui initialise un objet avec les coordonnées actuelles du pointeur de la souris. Pour cela, on lui passe en paramètre un pointeur sur une instance d'un objet de type TPoint, lequel type permet d'identifier un point de l'espace en deux dimensions par une abscisse et une ordonnée.
TPoint * Position = new TPoint;
GetCursorPos (Position);
int x = Position- > x;
int y = Position- > y;
delete Position;
|
|
lien : Comment gérer le clavier et la souris avec l'API Windows ?
|
| auteurs : Al-Yazdi, Ricky81 | Il suffit de déplacer la souris, faire croire à Windows que le bouton est appuyé, puis relâcher et remettre (ou pas) le curseur en place. Voici comment faire :
void __fastcall TForm1:: Button1Click (TObject * Sender)
{
TPoint MyPoint;
GetCursorPos (& MyPoint);
SetCursorPos (200 , 200 );
mouse_event (MOUSEEVENTF_LEFTDOWN, 0 , 0 , 0 , 0 );
mouse_event (MOUSEEVENTF_LEFTUP, 0 , 0 , 0 , 0 );
SetCursorPos (MyPoint.x, MyPoint.y);
}
|
Il existe aussi les constantes :
- MOUSEEVENTF_RIGHTDOWN et MOUSEEVENTF_RIGHTUP pour provoquer des clics droits
- MOUSEEVENTF_MIDDLEDOWN et MOUSEEVENTF_MIDDLEUP pour provoquer un clic du bouton du milieu
- MOUSEEVENTF_MOVE pour faire croire que la souris a bougé sans la faire bouger
- MOUSEEVENTF_WHEEL pour faire croire que la molette a bougé (sans indication de sens)
|
lien : Comment gérer le clavier et la souris avec l'API Windows ?
|
| auteurs : Nono40, Ricky81 | Il est possible de tester à tout moment l'état d'une touche du clavier ou d'un bouton de la souris grâce à la fonction API :
short GetAsyncKeyState (int vKey)
|
Cette fonction retourne l'état de la touche, le bit 15 du résultat est à 1 si la touche (ou le bouton) est actuellement enfoncée. Le test fonctionne aussi même si l'application n'est pas active. Le numéro de touche passé en paramètre doit être le code de touche virtuelle. C++ Builder définit les constantes VK_xxxx pour chaque touche du clavier. A noter que pour les touches de type lettre, on peut également utiliser le code ASCII de la lettre majuscule, ou le charactère correspondant (ce qui revient au même).
Pour obtenir la liste des codes de touche virtuelle, recherchez dans l'aide de BCB la rubrique Codes de touche virtuelle
Par exemple pour tester l'état du bouton gauche de la souris :
void __fastcall TForm1:: Timer1Timer (TObject * Sender)
{
if ((GetAsyncKeyState (VK_LBUTTON) & 0x8000 ) ! = 0 )
{
Label1- > Caption = " Enfoncé " ;
}
else
{
Label1- > Caption = " Relâché " ;
}
}
|
|
lien : Comment gérer le clavier et la souris avec l'API Windows ?
lien : Comment intercepter tous les évènements clavier des composants d'une fiche ?
lien : Comment détecter le verrouillage des touches (NumLock, CapsLock, ScrollLock) ?
|
| auteurs : blondelle, pottiez, henderson |
Cette fonction repète une action tant que le bouton gauche de la souris reste enfoncé.
Attention : ne pas utiliser dans le code les variables X et Y qui sont les coordonnées de la souris.
void __fastcall TForm1:: Button1MouseDown (TObject * Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
unsigned int time;
int a = 0 ;
while ((GetAsyncKeyState (VK_LBUTTON) & 0x8000 ) ! = 0 )
{
a = a + 1 ;
Label1- > Caption = a;
Application- > ProcessMessages ();
time = GetTickCount ();
while (GetTickCount () < time + 150 )
{
}
}
}
|
La boucle " while ((GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0) " répète l'action tant que le bouton gauche reste enfoncé, dès que celui-ci est relaché l'action cesse.
La boucle " while (GetTickCount() < time + 150) " assure une temporisation qui ralentit le test sur l'état du bouton afin de ne prendre en compte que l'incrément de 1 lors d'un appui bref.
|
Consultez les autres F.A.Q.
|
|