Je dois être capable de détecter que la touche majuscule est maintenue, mais je ne veux pas utiliser d'événements ou de variables globales pour le déterminer. Y at-il une API en C# qui vous permet de demander quelles touches sont actuellement pressées au lieu d'utiliser l'événement?La touche de détection de touche est enfoncée sans utiliser d'événements dans Windows Forms?
Répondre
Vous ne savez pas si cela est disponible en C#, mais vous pouvez appeler GetAsyncKeyState. Cette méthode renvoie l'état d'une clé au moment de l'appel de la méthode.
Pour l'appeler à partir de C#, vous devez utiliser interop comme toute autre API Win32.
Form.ModifierKeys
(propriété statique)
Vous pouvez installer un low-level keyboard hook.
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class InterceptKeys
{
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
public static void Main()
{
_hookID = SetHook(_proc);
Application.Run();
UnhookWindowsHookEx(_hookID);
}
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}
private delegate IntPtr LowLevelKeyboardProc(
int nCode, IntPtr wParam, IntPtr lParam);
private static IntPtr HookCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Console.WriteLine((Keys)vkCode);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
}
if ((Control.ModifierKeys & Keys.Shift) != 0)
Ce sera également true
si une autre touche de modification est également en baisse (par exemple, Ctrl + Maj). Si vous voulez vérifier si seul Shift est appuyée sans autres modificateurs, utilisez
if (Control.ModifierKeys == Keys.Shift)
Notez que même ce sera true
si un autre non-modificateur est vers le bas (par exemple, Maj + A). Si vous voulez vérifier si Shift et seulement Shift est pressé, vous devrez utiliser un appel d'API.
Si vous êtes dans une classe qui hérite Control
(comme une forme), vous pouvez supprimer le qualificatif Control
. (static
propriétés n'ont pas besoin de qualificateurs dans les classes héritées)
- 1. elisp comment vérifier si la touche Shift est enfoncée
- 2. Touche "Windows" dans le cadre d'une touche de raccourci
- 3. Comment vérifier si la touche enfoncée était une touche fléchée dans Java KeyListener?
- 4. Utiliser la touche Windows à d'autres fins dans C#
- 5. C#: Dans un événement KeyDown, que dois-je utiliser pour vérifier quelle touche est enfoncée?
- 6. Entrée Touche non consommée par MessageBox, C#, Windows Forms
- 7. Transmettre l'événement de touche enfoncée à l'applet et l'arrêter propagation
- 8. C# - Détecter si la touche MAJ est enfoncée lors de l'ouverture d'un menu contextuel
- 9. Comment savoir quelle touche SHIFT a été enfoncée?
- 10. Comment détecter que la touche fléchée est enfoncée en utilisant C sous Linux ou Solaris?
- 11. Déplacement entre les contrôles de dialogue dans Windows Mobile sans la touche de tabulation
- 12. Capture de la touche Windows dans C# (wpf)
- 13. Capture de la touche "Supprimer" avec jQuery
- 14. Windows Forms - Appuyez sur la touche pour activer le bouton de soumission.
- 15. Essayer de comprendre comment déclenché un événement lorsque la touche entrée est enfoncée dans une zone de texte
- 16. éliminer la touche d'entrée après l'avoir enfoncée dans l'événement keyup d'une zone de texte
- 17. Appel d'un bouton spécifique événement onClick lorsque la touche Entrée est enfoncée C#
- 18. Safari: Soumettre le formulaire en utilisant xhrPost lorsque la touche Entrée est enfoncée
- 19. calendarextender ne se ferme pas lorsque la touche d'échappement est enfoncée
- 20. Comment mapper globalement la touche AltGr à la touche Alt?
- 21. ActionScript 2: Est-il possible de tester si la souris est enfoncée sans configurer un événement?
- 22. Comment puis-je déterminer quand la touche de contrôle est maintenue enfoncée pendant le clic du bouton
- 23. AddMessageFilter sans Windows Forms?
- 24. Touche de commande plus molette de la souris
- 25. Comment capturer la touche Impr écran?
- 26. La touche Windows peut-elle être mappée dans Vim?
- 27. Comment déterminez-vous si un caractère nécessite que la touche Majuscule soit enfoncée pour être tapée?
- 28. C# Comment désactiver une touche
- 29. Thickbox ne se ferme pas lorsque la touche Échap est enfoncée lorsque l'iframe est mis au point
- 30. La touche de retour arrière de telnet est incorrecte
Cela fonctionne, mais la propriété est héritée de Contrôle pas Form –