J'ai une application utilisant le code suivant pour obtenir une entrée basée sur un fichier généré à partir d'une application tierce.Problème de mise au point du clavier Tricky C# form
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
switch (keyData)
{
case Keys.F1:
clicked_F1(null, null);
break;
case Keys.F2:
clicked_F2(null, null);
break;
case Keys.F3:
clicked_F3(null, null);
break;
}
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
Form.TopMost est définie sur true et this.Activate() est appelée pendant le rappel OnShown. Cela fonctionne sur la plupart des machines mais parfois l'entrée du clavier ne sera pas transmise à mon application, l'aide de Windows par exemple apparaîtra si F1 est pressé.
Quelqu'un peut-il expliquer ce comportement? Je dois m'assurer que mon formulaire recevra ces événements clavier.
Cheers, Richard
Merci Hans. Je définis la méthode Activate() dans le rappel OnShown. J'ai besoin de placer une fenêtre au-dessus d'une application Till héritée qui est toujours en cours d'exécution avec TopMost défini pour fournir une option supplémentaire pour les utilisateurs. –
Eh bien, Windows ne s'en soucie pas beaucoup. Je pense que pinThroking AttachThreadInput() pourrait aider, vous aurez besoin d'obtenir le TID du thread UI de ce programme. GetWindowThreadProcessId(). –
Absolument correct ce n'est pas une situation conventionnelle - j'aimerais pouvoir le faire d'une autre manière. Je pourrais revenir à la planche à dessin et voir s'il y a une autre option. –