Connaitre le champs qui possède le focus [Résolu]

Messages postés
33
Date d'inscription
vendredi 30 janvier 2004
Dernière intervention
15 mai 2008
- - Dernière réponse : aquibad
Messages postés
33
Date d'inscription
vendredi 30 janvier 2004
Dernière intervention
15 mai 2008
- 22 juin 2006 à 14:04
bonjour à tous,

Voila, mon problème est que je dois faire un clavier virtuel.

En utilisant ce code , ça marche trés bien sur un champs dont je suis obligeais de donner le focus car en cliquant sur le bouton, je suis dans les choux.
private

void btn_Q_Click(
object sender, System.EventArgs e)
{
ch_rech_libelle.Focus();
SendKeys.Send(
"Q");
}
Ma Question : Comment je peux faire pour saisir dans n'importe quel champs du form, sans perdre le focus ?

Merci à tous.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
3
Merci
La propriété ActiveControl permet de récupérer le contrôle qui a le focus.

Un exemple avec PostMessage :

public partial class Form1 : Form
{
    private const int WM_CHAR = 0x0102;


    [ DllImport( "User32.dll", SetLastError = true ) ]
    private static extern bool PostMessage( IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam );


    public Form1( )
    {
        InitializeComponent( );


        TextBox tb1 = new TextBox( );
        tb1.Multiline = true;
        tb1.Size = new Size( 150, 50 );
        tb1.Location = new Point( 0, 0 );


        TextBox tb2 = new TextBox( );
        tb2.Multiline = true;
        tb2.Size = new Size( 150, 50 );
        tb2.Location = new Point( 0, 50 );


        MyButton b1 = new MyButton( );
        b1.Location = new Point( 0, 100 );
        b1.Text = "a";
        b1.Click += new EventHandler( VirtualKeyboard_Click );


        MyButton b2 = new MyButton( );
        b2.Location = new Point( 100, 100 );
        b2.Text = "z";
        b2.Click += new EventHandler( VirtualKeyboard_Click );


        this.Controls.AddRange( new Control[ ] { tb1, tb2, b1, b2 } );
    }


    private void VirtualKeyboard_Click( object sender, EventArgs e )
    {
        MyButton b = ( MyButton )sender;
        PostMessage( this.ActiveControl.Handle, WM_CHAR, ( UIntPtr )b.Text[ 0 ], IntPtr.Zero );
    }


    private class MyButton : Button
    {
        public MyButton( ) : base( )
        {
            this.SetStyle( ControlStyles.Selectable, false );
        }
    }
}

Merci Lutinore 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Lutinore
Messages postés
1108
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
10 juillet 2018
0
Merci
salut,

tu utilises .NET 1.1 ou 2.0 ?
Je viens de tester ta fonction avec une textbox, ca marche bie (pas de perte de focus) j'utiliseur Visual C# 2005
Commenter la réponse de fregolo52
Messages postés
40
Date d'inscription
samedi 19 mars 2005
Dernière intervention
10 février 2011
0
Merci
Est-ce que tu peux être plus explicite, s'il te plaît. Moi je comprend que tu as un formulaire qui contient plusieurs boutons, sur chacun d'eux est écris une lettre de l'alphabet. Ce que je ne comprend pas c'est où est-ce que tu affiche la lettre. Si c'est dans un TextBox1, tu n'as qu'à faire TextBox1.Text = btn_Q.Text. Présente clairement ton problème!
Commenter la réponse de olivierbalagizi
Messages postés
33
Date d'inscription
vendredi 30 janvier 2004
Dernière intervention
15 mai 2008
0
Merci
Voila en plus détaillé :

Dans un form j'ai plusieurs textbox, mais un seul a le focus.
Dans le meme form j'ai plusieurs bouton qui represent les touches du clavier.

Mon but et de saisir dans le textbox les caractères en cliquant le bouton correspondant.

Mon probleme : 
   En cliquant sur un bouton je perds le focus du textbox , ce qui ne permets pas a SendKeys.Send("Q") de s'afficher dans le textbox. C'est pour çà que j'ai mis juste avant" "Nom_du_champ".focus().
Mais cette solution n'est pas viable puisque j'ai pulsieurs textbox.


 


Comment je peux remplacer "Nom_du_champ" par le nom du textbox qui possède le focus.
Ou alors comment ne pas perdre le focus en cliquant sur les boutons.

Merci
Commenter la réponse de aquibad
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
Salut,

Une solution serait de dériver tes boutons de cette classe :


public class MyButton : Button
{
    public MyButton( ) : base( )
    {
        this.SetStyle( ControlStyles.Selectable, false );
    }
}


Je te conseille aussi d'utiliser un seul gestionnaire d'évènement pour toutes les touches et non pas plusieurs évènements comme ça semble être le cas.


private void VirtualKey_Click( object sender, EventArgs e )
{
    Button b = ( Button )sender;
    SendKeys.Send( b.Text );
}




SendKey me semble pas la meilleure méthode non plus, regarde du coté de la fonction Win32 PostMessage.
Commenter la réponse de Lutinore
Messages postés
33
Date d'inscription
vendredi 30 janvier 2004
Dernière intervention
15 mai 2008
0
Merci
Salut Lutinor,

Pour le gestionnaire d'évènement , je pensais bien le mettre plus tard, c'est une solution interressante que j'avais remarqué lors de mes recherches sur le site.
Par contre j'ai essayé de changer la propriété (dans la liste) du bouton mais il apparait que cela ne fonctionne pas lors du clic souris mais bien seulement lors de l'utilisation de la touche tabulation.

Cet aprem j'ai regardé sendmessage, mais c'est beaucoup plus compliqué.
Demain je me pencherai sur postmessage.

Merci et a+
Commenter la réponse de aquibad
Messages postés
33
Date d'inscription
vendredi 30 janvier 2004
Dernière intervention
15 mai 2008
0
Merci
Super Lutinore !
ça fonctionne nickel.


 


Finalement c'est facile quand on sait ! :o)

Merci encore.
Commenter la réponse de aquibad

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.