Bonjour ! Voyez-vous le clavier virtuel de Windows ? Celui-ci !
Bref, je m’interroge beaucoup dessus. C’est un programme… Donc que sa fenêtre passe par dessus les autres même en changeant le focus, je peux me figurer comment ça fonctionne. Par contre, que ce programme puisse envoyer des choses à tous les autres (du texte quoi), et que quand je clique sur une lettre pour écrire ce message le focus reste sur le navigateur, ça ça me fascine !
Je suis en vacances, donc j’ai du temps libre devant moi. Dans ce cas, le meilleur moyen de comprendre comment fonctionnent les deux trucs mentionnés en haut, c’est de recréer ce programme from scratch.
C’est là que j’ai besoin d’aide : Je ne sais pas par où commencer. Je connais le C++ (Qui me semble être le plus adapté des langages que je connais), mais ça a ses limites : simuler une entrée clavier après un clic… Bon je suppose que je vais avoir besoin de Qt pour faire de la gestion d’évènements propres, et que je vais me limiter à 6 lettres pour commencer et comprendre le principe, mais ça s’arrête là. Derrière, comment définir la priorité de mon programme par rapport aux autres, quelles librairies utiliser, je ne sais pas.
ChatGPT me parle de 'Windows API’, mais je crois que c’est pour du C ? Ce qui me priverai de Qt qui serait si utile pour la partie graphique, et aussi de l’aspect orienté objet. Certaines vidéos parlent de Visual C++ dont je ne connais pas les subtilité par rapport au C++ normal. Enfin en scrollant sur Google, je trouve Qt Virtual Keyboard, mais il semble que ce soit pour créer un clavier qui reste cantonné au programme où il est inclut…
Avez-vous des indications pour démarrer ce projet ?
Merci !
Edit
Avant de m’attaquer l’interface graphique, ça me semble plus important de faire fonctionner les différentes fonctions du programme. De fil en aiguille, je suis arrivé à la doc de la fonction SendInput()
. Qui fait exactement ce qu’il faut : elle envoie à l’OS l’information qu’il y a eu une entrée clavier, et c’est lui qui gère ! Bon j’aimerai bien savoir comment cette fonction fait ça, mais je ne pense pas encore avoir le niveau pour la communication avec les OS, peut-être programme de l’année prochaine ça.
J’ai fait une petite application rapide, pour vérifier que cette fonction a bien le comportement attendu…
/*
* main.cpp
*
*/
// Headers
#include <iostream>
#include <Windows.h>
int main(int argc, char *argv[]){
std::cout << "Hello World!" << std::endl;
INPUT inputs[4] = {};
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_LWIN;
//...
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = VK_LWIN;
inputs[1].ki.dwFlags = KEYEVENTF_KEYUP;
//...
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = 'A';
//...
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = 'A';
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
return 0;
}
J’ai bien le menu Windows qui s’ouvre ! je suis trop content, j’ai reçu la même excitation que quand on fait son premier "programme" et qu’une console s’ouvre pour afficher "Hello World!" :’D … Me jugez pas. XP
Cependant, la lettre 'A' n’est pas tapée dans la barre de recherche du menu Démarrer. J’ai bien essayé à la classique : J’ai pas besoin d’aller cliquer dessus normalement, juste appuyer sur une lettre (quand le menu est ouvert) suffit à mettre le focus sur la barre de recherche. Quelle peut être la cause de cela ? le délai ? Je ne vois pas de manière, dans la doc, d’imposer un délai entre les appuis de touches, et faire plusieurs appels successifs de SendInput()
avec un appel à Sleep()
entre chaque me paraît être une pratique très… Sale ?
P.S. : Oui, je sais qu’avec cette méthode je me prive de faire fonctionner le programme sur Linux… Comprendre le fonctionnement sur Windows est une étape, le comprendre pour Linux en sera une autre, puis créer ma fonction 'UtiliserClavier()` qui fera elle-même l’interface entre mon code principal et les fonctions variants selon les OS en sera une dernière à la toute fin. :’D