IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Réalisation d'un clavier virtuel


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de marcootz
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 159
    Par défaut Réalisation d'un clavier virtuel
    Salut à tous,
    Pour les besoins d'une application je dois réaliser un clavier virtuel, dans le style de celui présent dans Windows.

    J'ai donc dans mon appli une page avec un TEdit. Dans l'événement "OnEnter" de ce TEdit, j'appelle ma fiche "Clavier", qui passe donc en premier plan. Sur cette fiche clavier je clique sur le bouton "A", je fais passé ma première fiche en premier plan, j'envoie l'événement clavier correspondant à la touche "A" et le caractère "A" s'affiche dans mon Edit.
    Jusque la donc tous va bien.

    Mais ensuite j'aimerais que mon clavier reste en premier plan pour saisir la deuxième lettre, mais impossible de faire ça.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Appel de mon clavier à partir de la première fiche :
     
    void __fastcall TForm1::Edit1Enter(TObject *Sender)
    {
    	//hFenetre est de type HWND, c'est le handle de ma fiche qui contient le edit 
    	FClavierVirtuel->hFenetre = GetForegroundWindow();
    	FClavierVirtuel->Show();
    }
    Le clavier passe en premier plan et j'appuie sur "A"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TFClavierVirtuel::AClick(TObject *Sender)
    {
    	HWND hClavier = GetForegroundWindow();
    	SetForegroundWindow(hFenetre);
    	Sleep(50);
    	keybd_event('A',0x29,0,0);// Simulation appuie a
    	keybd_event('A',0x29,KEYEVENTF_KEYUP,0);//Relache a
    	Sleep(50);
    	//SetForegroundWindow(hClavier);
    }
    C'est cette ligne qui me pose souci "SetForegroundWindow(hClavier);". Sans elle le clavier fonctionne mais après un clic il reste derrière. Si je met cette ligne pour faire passer ma fenêtre "Clavier" devant ça ne marche plus.

    Avez vous une petite idée ??

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Vérifie que tu as bien la bonne fenêtre... (via un getWindowName() par exemple...)

  3. #3
    Membre confirmé Avatar de marcootz
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 159
    Par défaut
    Oui je pense que c'est bien la bonne fenetre. J'ai utilisé le code founi dans la FAQ :
    http://cpp.developpez.com/faq/bcb/?p...assnamefenetre

    Ce qui est bizarre c'est quand je met la ligne "SetForegroundWindow(hClavier);" mon caractère saisi n'apparait plus dans la zone de texte de ma page principale...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    le truc , c est de faire comme sur psp ou ps3

    le clavier virtuel contient lui meme un edit

    et

    un bouton enter pour envoyer le texte saisi vers un autre edit dans ton cas


    penses egalement à recuperer la chaine presente dans ton edit "principal" lorsque que tu appelles ton clavier ( pour les erreurs de saisie ) .


    Enfin pourquoi ne pas utiliser un Tpanel dont tu passes la proprieté visible à true ou false , çà faciliterait le boulot je pense .

  5. #5
    Membre confirmé Avatar de marcootz
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 159
    Par défaut
    C'est vrai que l'idée du TPanel aurait été beaucoup plus simple mais j'ai besoin du clavier dans plusieurs fiches et j'aimerais pouvoir avoir une forme séparé que j'appelle au besoin.

    Sinon pour le coup de l'edit sur le clavier c'est une bonne idée, mais c'est dommage car je suis sur qu'il y a un moyen simple pour avoir le même fonctionnement qu'un clavier virtuel classique.

    Merci
    A+

  6. #6
    Membre confirmé Avatar de marcootz
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 159
    Par défaut
    Bon en fait j'ai réussi à m'en sortir en utilisant un timer. Lors du clic sur ma touche 'A', j'active un Timer de 10ms qui fait repasser ma fiche clavier au premier plan :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TFClavierVirtuel::AClick(TObject *Sender)
    {
    	SetForegroundWindow(hFenetre);
    	Sleep(50);
    	keybd_event('A',0x29,0,0);// Simulation appuie a
    	keybd_event('A',0x29,KEYEVENTF_KEYUP,0);//Relache a
    	Timer1->Enabled=true;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TFClavierVirtuel::Timer1Timer(TObject *Sender)
    {
    	SetForegroundWindow(hClavier);
    	Timer1->Enabled = false;	
    }
    Voilà c'est bancal mais ça marche. Pour l'instant je laisse comme ça mais si vous avez une meilleure idée je suis preneur.

    En tout cas merci pour votre aide.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. clavier virtuel sur Formulaire
    Par db48752b dans le forum IHM
    Réponses: 9
    Dernier message: 01/03/2017, 11h30
  2. clavier virtuel =)
    Par Ludo_360 dans le forum Delphi
    Réponses: 2
    Dernier message: 27/04/2007, 15h45
  3. Lancement du clavier virtuel
    Par rzayani dans le forum Windows
    Réponses: 1
    Dernier message: 21/08/2006, 16h16
  4. Programmer un clavier virtuel
    Par juvamine dans le forum Windows
    Réponses: 1
    Dernier message: 30/07/2006, 17h47
  5. Clavier virtuel
    Par ouquoi dans le forum MFC
    Réponses: 2
    Dernier message: 22/02/2006, 11h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo