Clavier virtuel et focus

cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 - 26 août 2010 à 07:15
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 - 31 août 2010 à 10:54
Bonjour,
j'ai une question sur la creation d'un clavier virtuel pour une appication.
Je voudrais realiser une application tactile et il me faut donc un clavier virtuel dedans.
Pour l'intant j'ai "fait" un clavier avec edes boutons ou il ya les caracteres dessus, c'est un control de mon form principal (mdiparent)
quand certains forms fils sont lancés avec des textbox ou autre...
je fais apparaitre le clavier (en topmost=true)
je rencontre un probleme quand le form que je fais apparaitre est modal (showdialog()) , je n'ai plus alors acces au clavier bien qu'il soit visible...
comment puis je faire pour dissocier , les deux..
tjrs pouvoir taper sur le clavier sans qu'il ai jamais le focus mais accessible ...
En fait je voudrais pouvoir dans n'importe quel condition utiliser ce clavier , est ce possible ? comment ?

Merci

9 réponses

cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
26 août 2010 à 08:48
j'ai ajouté ca que j'ai trouvé sur le forum et internet :

private const int WS_CAPTION = 0xc00000;

/// <summary>
/// Override virtual method to have a form with Resizable borders but no
/// TitleBar and to made the form inactive when clicks are performed over its
/// </summary>
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
long Style = cp.Style;
//pour ne pas voir le border
//cp.Style ^= WS_CAPTION;
cp.ExStyle |= WS_EX_NOACTIVATE;
return cp;
}
}

mais je n'arrive toujorus pas a y acceder

//si pavnum mon clavier

pavnum.show();
login.showdialog();

ne permet d'acceder a pavnum...
0
deadhand Messages postés 152 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 27 août 2010 3
26 août 2010 à 14:26
Salut !
De mon point de vue ca arrive parce que tu es sur le même thread que la form qui demande un ShowDialog (qui met en "pause" toutes les autres form). Essaye de mettre ton clavier sur un thread asynchrone et à part.
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
26 août 2010 à 15:06
Bonjour

Même avis que Deadhand.

Soit tu te passes des Showdialog() en inhibant toi même le formulaire pricipal avant d'afficher les autres et tu mets en place des evenements pour récuperer les clicks du clavier virtuel.
Soit tu utilises un autre thread, mais attention aux événements entre les form il faudra tester InvokeRequired.


Bob
C# is amazing, enjoy it!
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
26 août 2010 à 17:23
Je ne maitrise pas trop les thread... mais j'ai testé ceci :



public void lancer_thread_clavier()
{
try
{

//this.Enabled = false;
//mess.Show();
//Cursor = Cursors.WaitCursor;
this.ThreadHasFinishedDelegate = new ThreadHasFinishedDelegateHandler(threadhasfinish);
clav_thread = new Thread(new ThreadStart(lancer_clavier));
clav_thread.Priority = ThreadPriority.Highest;
clav_thread.Start();
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

void lancer_clavier()
{
try
{
pavnum.Left = this.Left;
pavnum.Top = ok_ultraButton1.Bottom + 10;
pavnum.ShowDialog();

}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
this.Invoke(ThreadHasFinishedDelegate);
}
}


mais le positionnement du clavier ne me plait pas trop...(en fait il ne se place pas ou la ou je voudrais...

j'aimerais aussi pouvoir le cacher et le faire apparaitre a ma guise et dans différents forms (la c'est le form principal apartir duquel je le lance mais j'aimerais pouvoir le cacher/montrer a differents endroits et moments , j'aimerais aussi pouvoir ne montrer que la partie numérique ou le tout selon le formulaire que j'ai...)

comment implémenter cela ( ou une piste si vous avez ou des conseils )

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
26 août 2010 à 18:01
Je pense qu'il te faut définir une architecture differente.

par exemple
Mets ton clavier virtuel dans une DLL qui comportera une class d'interface avec des méthodes public et static telles que
ShowKeyboard(), HideKeyboard(), MoveKeyboard(point location) etc... accessible par tout le monde.

Cette class pourra aussi recuperer les evenements en provenance de la fenetre du clavier et les "émettera" aux fenetres ayant souscris aux evenements.

Dans la methode ShowKeyboard() tu lanceras ton thread s'il ce n'est pas encore fait.
Conserve un menbre static sur ton thread, cela permettra à cette class de communiquer avec le thread via des propriété public.

pour cacher le clavier il suffit d'appeller la méthod Hide() de la fenetre principale.

Bon code
Bob

C# is amazing, enjoy it!
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
27 août 2010 à 08:51
Merci , c'est un peu l'idée que j'avais...
mais comme il y a des threads qui interviennent...
je ne suis pas sur de moi.
je defini un form_clavier_virtuel ds une dll . ca OK
je met les methodes ShowKeyboard(), HideKeyboard(), MoveKeyboard(point location) dans le meme form ?
avec le thread dans showkeyboard ? (je ne sais pas comment on fait)
"Conserve un menbre static sur ton thread, cela permettra à cette class de communiquer avec le thread via des propriété public"
ca je ne comprend pas trop non plus ...

je voudrais effectivement que mon clavier soit "static"

je voudrais pouvoir faire depuis n'importe quel formulaire : ma_class_clavier_virtuel.showkeyboard() ,etc....
mais je ne sais pas comment...

J'apprécierais bien de l'aide (c'est surtout comment placer le thread et l'implementer ou je bloque...)

Merci
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
27 août 2010 à 15:55
J'ai essayé quelque chose mais evidemment cela ne fontionne pas :
j'ai créé unne class class_constante (dans laquell je voudrais mettre que des controles ou "variables" constantes et visibles de tous dont le clavier virtuel

j'ai d'un coté le form_clavier_virtuel (qui contient justes les methodes d'appui sur les touches : sendinupt..)

et de l'autre ma classe constante ou j'ai mis :
#region clavier virtuel

public static Form_pave_numerique clavier = new Form_pave_numerique();

//VARIABLES.Form_pave_numerique pavnum = new VARIABLES.Form_pave_numerique();
public static Thread clav_thread;
private ThreadHasFinishedDelegateHandler ThreadHasFinishedDelegate;
internal delegate void ThreadHasFinishedDelegateHandler();


#region thread clavier test

public static void lancer_thread_clavier()
{
try
{

//this.Enabled = false;
//mess.Show();
//Cursor = Cursors.WaitCursor;
//this.ThreadHasFinishedDelegate = new ThreadHasFinishedDelegateHandler(threadhasfinish);
clav_thread = new Thread(new ThreadStart(lancer_clavier));
clav_thread.Priority = ThreadPriority.Highest;
clav_thread.Start();
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

static void lancer_clavier()
{
try
{
clavier.ShowDialog();

}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
//this.Invoke(ThreadHasFinishedDelegate);
}
}

private void threadhasfinish()
{
try
{
//MessageBox.Show("pavnum hide");
//pavnum.Hide();
//Cursor = Cursors.Default;
//this.Enabled = true;
//DialogResult = DialogResult.OK;
//this.Dispose();

}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

//void tact_FormClosed(object sender, FormClosedEventArgs e)
//{
// //MessageBox.Show("tact closed");
// //throw new NotImplementedException();
// //this.Close();
// //Application.Exit();
//}

public static void showkeyboard()
{
try
{
clavier.Show();
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

public static void hidekeyboard()
{
try
{
clavier.Hide();
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

public static void movekeyboard(int x, int y)
{
try
{
clavier.Left = x;
clavier.Top = y;
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

#endregion


evidemment ca ne marche pas , j'ai des messages d'appel inter thread etc...


le comportement que j'aimerais avoir (mais ej ne sais pas comment l'implémenter )

depuis un formulaire quelconque

si je detecte l'entree dans un textbox ou l'appui sur un bouton (bref je decide lors de l'evenement)
j'appelle class_constante.movekeyboard(x,y) et class_constante.showkeyboard()
ou meme un class_constante.showkeyboard(x,y)....

voila reste qu'a faire ca avec des threads je crois mais je ne sais pas le faire...
ce serait d'ailleurs une bonne chose a apprendre a maitriser je pense...

merci de votre aide
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
31 août 2010 à 08:14
Je n'ai pas une tres bonne visualisation de ce qu'il faudrait que je fasse...
organisation dans les class etc...ou doivent se trouver les methodes et comment les lancer...
la methode pour lancer le thread ca va (je pense)

public static void lancer_thread_clavier()
{
try
{
clav_thread = new Thread(new ThreadStart(lancer_clavier));
clav_thread.Priority = ThreadPriority.Highest;
clav_thread.Start();
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

mais apres, je voudrais (enfin je crois) aller modifier ce thread grace a des methodes static
ds ma fonction hide (que je ne sais pas comment implementer et ou la mettre : ds ma class_constante ou dans le form du clavier directement ?)
je voudrais en fait juste changer la propriete du clavier (faire clavier.hide() ou bien alors clavier.visible=false)
mais voila , je ne sais pas comment l'implémenter...

Je serais tres reconnaissant de recevoir un coup de main la dessus
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
31 août 2010 à 10:54
En cherchant sur internet j'ai essayé :

dans class_constante:

static ThreadCacherClavierDelegateHandler ThreadCacherClavierDelegate;
internal delegate void ThreadCacherClavierDelegateHandler();

public static void lancer_thread_clavier()
{
try
{

//this.Enabled = false;
//mess.Show();
//Cursor = Cursors.WaitCursor;
//ThreadHasFinishedDelegate = new ThreadHasFinishedDelegateHandler(threadhasfinish);

ThreadCacherClavierDelegate = new ThreadCacherClavierDelegateHandler(threadcacherclavier);
ThreadMontrerClavierDelegate = new ThreadMontrerClavierDelegateHandler(threadmontrerclavier);
clav_thread = new Thread(new ThreadStart(lancer_clavier));
clav_thread.Priority = ThreadPriority.Highest;
clav_thread.Start();
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

private static void threadcacherclavier()
{
try
{
clavier.Hide();
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

public static void hidekeyboard()
{
try
{
clavier.Invoke(ThreadCacherClavierDelegate);
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
}

j'ai fait un fomrulaire ou il y a un bouton hide();
quand je clique dessus j'appelle class_constante.hidekeyboard();
j'appelle donc hidekeyboard depuis le formulaire que je veux
ca ne fonctionne qu'une fois : la seconde fois j'ai un message :
"impossible d'appeler invoke ou begininvoke sur un controle tant que le handle de fenetre n'a pas ete cree"

Je patauge dans la semoule...
0
Rejoignez-nous