2009-05-14 4 views
0

Je souhaite créer un pavé numérique virtuel, similaire au clavier virtuel. Comment puis-je empêcher l'activation/la mise au point du formulaire, de sorte que lorsque j'appuie sur un bouton, l'appel SendKeys.Send passe au bon formulaire? Je suis certain que je dois utiliser une API non gérée pour cela, mais à part ça, je ne sais même pas par où commencer. Merci pour toute aide!Création d'un pavé numérique virtuel: arrêt de l'activation ou de la mise au point du formulaire

+0

S'agit-il d'un clavier qui fonctionne avec _any_ application (comme le clavier virtuel sur les tablettes) ou uniquement pour les applications que vous écrivez? –

+0

Seulement pour les applications que j'écris. J'ai outrepassé la méthode WndProc pour définir le message. Résultat: MA_NOACTIVATE, mais il semble que le formulaire soit toujours activé lorsque je clique sur un bouton. –

Répondre

1

Vous pouvez contrôler la façon dont votre formulaire est créé en remplaçant la propriété CreateParams protégée:

protected override CreateParams CreateParams { 
    get { 
    var cp = base.CreateParams; 
    // Configure the CreateParams structure here 
    return cp; 
    } 
} 

Je vous conseille d'essayer le style suivant:

int WS_EX_NOACTIVATE = 0x08000000; 
cp.ExStyle = cp.ExStyle | WS_EX_NOACTIVATE; 

Le style WS_EX_NOACTIVATE empêche l'entrée de la souris de donner un focus de fenêtre (vous pouvez l'utiliser pour créer des fenêtres semblables à des bulles d'aide, par exemple.)

Vous pouvez combiner ceci avec d'autres styles (comme WS_EX_TOPMOST) pour obtenir le comportement que vous recherchez.

0

Un formulaire qui n'a pas de focus ne reçoit généralement pas de saisie au clavier. Donc, je ne suis pas sûr de savoir comment cela fonctionnerait.

0

Si le pavé numérique ne doit fonctionner que dans les applications que vous écrivez, vous pouvez simplement garder une trace du dernier contrôle de saisie valide qui a eu le focus. De cette façon, vous n'avez pas à vous soucier de quelque chose qui vole la vedette. Récemment, j'ai fait quelque chose de similaire en abonnant un tas d'événements Enter TextBoxes au même gestionnaire d'événement que mon handle de contrôle focalisé au paramètre sender. Cette méthode exacte peut ne pas fonctionner pour vous, mais l'approche pourrait le rendre plus facile.

0

Avec les applications que vous écrivez, tenez compte du modèle Observer.

Dans le cas général, vous pouvez ajouter une méthode Subscribe à votre clavier qui prend un délégué (également autoriser le désabonnement). Pour la gestion des événements de votre touche, passez en revue tous les délégués inscrits en leur envoyant le code de caractère.

code (la plupart du temps de la mémoire, extraits probablement ne compilera pas, mais si vous y aller)

delegate void KeyPadSubscription (char keyPressed); 
List<KeyPadSubscription> subscriptions; 

void KeyPress (object sender, KeyPressArgs e) 
{ 
    foreach (KeyPadSubscription sub in subscriptions) 
     sub (e.CharCode) 
} 

void Subscribe(KeyPadSubscription s) 
{ 
    subscriptions.Add(s); 
} 

void Unsubscribe(KeyPadSubscription s) 
{ 
    subscriptions.Remove(s); 
} 

Dans votre cas, vous n'avez pas besoin probablement la liste des délégués et une propriété pourrait suffire. Puis, lorsque vos formulaires changent de focus, la forme active définit sa méthode en tant que délégué pour votre clavier.

void MyForm_Activated(...) 
{ 
    //assumes keypad is global or static 
    KeyPad.Subsribe (this.HandleKeyPadPress) 
} 
Questions connexes