2010-08-26 8 views
0

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

Répondre

3

Avoir votre formulaire est TopMost pas suffisante pour assurer cette méthode fonctionne. Votre formulaire doit également avoir le focus. Cela nécessite d'appeler sa méthode Activate() (SetForegroundWindow dans l'API Win32). Qui est pas garanti pour fonctionner, vous ne pouvez pas voler le focus loin d'une fenêtre que l'utilisateur utilise activement. Ce n'est que lorsque le temps écoulé depuis le dernier événement d'entrée est suffisant que vous pouvez saisir le focus.

Vous ne savez pas exactement ce que vous essayez de faire, peut-être avez-vous besoin d'un crochet de clavier ou utilisez RegisterHotKey.

+0

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. –

+0

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(). –

+0

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. –

Questions connexes