Necesito poder detectar que se está reteniendo la tecla shift, pero no quiero usar eventos o variables globales para determinar eso. ¿Hay una API en C# que le permite preguntar qué teclas están presionadas actualmente en lugar de usar el evento?¿Se presiona la tecla Detectar Shift sin usar eventos en Windows Forms?
Respuesta
No estoy seguro si esto está disponible en C# pero puede llamar al GetAsyncKeyState. Este método devuelve el estado de una clave en el momento en que se llama al método.
Para invocarlo desde C# necesitarás usar la interoperabilidad como cualquier otra API de Win32.
Form.ModifierKeys
(propiedad estática)
puede instalar 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)
Esto también será true
si otra tecla de modificación también es hacia abajo (por ejemplo, Shift Ctrl +). Si desea comprobar si Shift solo se presiona sin otros modificadores, utilice
if (Control.ModifierKeys == Keys.Shift)
Tenga en cuenta que incluso esto será true
si otro no modificadora está abajo (Por ejemplo, Shift + A). Si desea verificar si Shift y solo se presionan Shift, tendrá que usar una llamada API.
Si estás en una clase que hereda Control
(como un formulario), puede quitar el calificativo Control
. (static
propiedades no necesitan calificadores en clases heredadas)
- 1. ¿Cómo puedo detectar que se haya presionado la tecla Shift?
- 2. Cómo detectar si se presiona alguna tecla
- 3. Java: ¿podemos detectar si se presiona una tecla sin usar un Listener?
- 4. ¿Cómo saber si se presiona Shift en un evento MouseDown?
- 5. Determine si se presiona la tecla Shift durante el evento mousedown
- 6. Flex 4 detectar si el usuario presiona la tecla enter
- 7. Se mantiene presionada la tecla shift en JavaScript
- 8. ¿Cómo saber qué tecla SHIFT se presionó?
- 9. cómo detectar cuando una tecla de acceso directo (tecla de acceso directo) se presiona
- 10. Tecla de acceso rápido (no global) en Windows Forms .NET
- 11. ¿Cómo se presiona la última tecla de flecha usando maldiciones?
- 12. Windows Forms: capturar MouseWheel
- 13. ¿Es mejor usar WPF en Windows Forms?
- 14. Teclado suave sin un EditText y la tecla de detección presiona
- 15. Windows Forms: Entrar presionar tecla activa el botón de enviar?
- 16. combinación de captura en una aplicación Windows Forms
- 17. Reproducir un sonido cuando se presiona una tecla
- 18. ¿Cómo saber qué tecla de carácter se presiona?
- 19. UITextField Cómo comprobar si se presiona una tecla de borrar
- 20. Tab Index en Windows Forms
- 21. Detectar cuando se presiona el botón de inicio iOS
- 22. ¿Por qué Javascript suelta eventos keyUp cuando se presiona metaKey en los navegadores Mac?
- 23. acelerador (clave mnemotécnica) se ejecutan sin necesidad de pulsar la tecla ALT
- 24. El botón predeterminado en JFrame no se activa cuando se presiona la tecla enter
- 25. Cómo capturar una tecla "Listo" presiona desde el teclado virtual
- 26. Presiona presionando Enter en un formulario de Windows
- 27. Windows Forms - Multiple Event Loops
- 28. Teclee la tecla presionó controlador de eventos
- 29. ¿Cómo se manejan los eventos de pulsación de tecla en una aplicación de la consola Qt?
- 30. llamadas multihilo en la aplicación Windows Forms?
Esto funciona, pero la propiedad se hereda de Control not Form –