2010-09-30 11 views
2

Je voudrais récupérer l'état des clés Ctrl dans un endroit où je n'ai pas de formulaire.WinForms Récupérer l'état du clavier sans formulaire/UserControl

Normalement, pour obtenir un état de clé, j'utiliserais les événements Control_KeyDown/KeyUp. Cependant, le code qui doit savoir si vous appuyez sur Ctrl est en dehors de toute forme. Il y a un formulaire affiché, mais le code est supposé pas pour dépendre de cette forme mais trouver l'état de clé tout seul.

Sûrement il y a un moyen de le faire, seulement je n'arrive pas à le trouver sur google. Notez que bien que le code ne dispose pas d'un formulaire disponible, il s'agit toujours d'une application WinForms, donc peut-être que le framework fournit une classe/objet pour que j'atteigne cet objectif.

Contexte:

Au cours de la phase de démarrage de l'application, je veux un pas de se comporter differntly si la touche Ctrl est enfoncée dans ce moment-là. La phase de démarrage affiche un écran de démarrage, mais le code pour le démarrage n'est pas conscient de cela. Au lieu de cela, il signale la progression vers un rappel, et ce rappel met à jour l'écran de démarrage. Si j'utilise l'écran de démarrage pour récupérer l'événement KeyDown, je fais dépendre le code de démarrage de cet écran de démarrage, qui introduit une dépendance circulaire. Je veux garder la liberté d'enlever l'écran de démarrage et le remplacer par quelque chose de différent.

+0

Est-ce que cela signifie que votre application a besoin de savoir si Ctrl est cliqué quel que soit l'application est l'actif un? Donc, si vous travaillez dans un programme et cliquez sur Ctrl, vous voulez que votre programme l'attrape? Dans ce cas, c'est un crochet de clavier que vous recherchez. Si vous confirmez cela, je peux vous donner quelques indications. –

+0

@ Øyvind: Il n'est pas nécessaire de remarquer Ctrl si une autre application est en face. En fait, il serait encore mieux si Ctrl n'est * pas * enregistré dans ce cas (voir ma mise à jour sur l'arrière-plan de ma question). – chiccodoro

Répondre

10

Vous pouvez utiliser la méthode statique sur Control appelé ModifierKeys

Control.ModifierKeys on MSDN

par exemple:

if (Control.ModifierKeys == Keys.Control) 
{ 
    //... 
} 
+0

J'ai essayé cela il y a quelques jours et cela n'a pas fonctionné, car à ce stade (initialisation avec splash screen) la boucle d'événements n'était pas encore lancée. (Voir aussi commentaire à testalino). Maintenant, l'écran de démarrage s'exécute dans une boucle de message, et la solution fonctionne. – chiccodoro

3

Je l'ai fait exactement ce que tout récemment:

static class NativeMethods 
    { 
     public static bool IsControlKeyDown() 
     { 
      return (GetKeyState(VK_CONTROL) & KEY_PRESSED) != 0; 
     } 
     private const int KEY_PRESSED = 0x8000; 
     private const int VK_CONTROL = 0x11; 
     [System.Runtime.InteropServices.DllImport("user32.dll")] 
     static extern short GetKeyState(int key); 
    } 

Pour tester le code, créez une nouvelle application console et utilisez la principale méthode suivante:

static void Main(string[] args) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      Console.WriteLine(NativeMethods.IsControlKeyDown()); 
      System.Threading.Thread.Sleep(100); 
     } 
    } 
+0

Merci, ça va bien. Y a-t-il aussi une façon non autochtone? – chiccodoro

+0

Je n'ai pas trouvé de solutions non-natives il y a quelques jours. – testalino

+0

@testalino: J'ai copié et collé votre code et ajouté un appel à IsControlKeyDown(), mais il a renvoyé false même si j'appuie sur les deux touches Ctrl. – chiccodoro

0

ne peut pas vous attraper juste le Ctrl étant appuyé sur le formulaire que est affiché, puisqu'il semble que cette forme fait également partie de l'appication, et relayer le clic à la partie "informe" du code en utilisant un événement que le formulaire peut invoquer?

Je pourrais mal comprendre ce que vous êtes après ici, mais cela semble être une option au moins.

+0

Oui, je pense à cette approche aussi. Cependant dans mon cas cela introduit une dépendance que je préférerais éviter (voir mise à jour sur ma question). – chiccodoro