Tecla de fondo Pulse Listener

Tengo una aplicación de formulario de ventana simple que activa el locking de mayúsculas cuando presiono la barra espaciadora y la apago si presiono una letra.

El problema es que tengo que concentrarme en la ventana para que funcione (la parte superior no funciona tampoco, la parte superior no se enfoca, solo muestra la ventana sobre todas las demás no enfocadas).

¿Alguien tiene alguna idea de cómo puedo hacer que funcione incluso si estoy escribiendo en un bloc de notas?

El registro de claves se puede usar para cosas malas, y manipular el locking de mayúsculas así parece bastante extraño, pero dado que la información ya está disponible públicamente, y conoce sus historias de usuario mejor que yo, he publicado una solución.

Aquí hay un ejemplo basado en el fragmento de código publicado desde el código del keylogger en C # en el foro de MSDN.

using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; class Program { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; private static bool lastKeyWasLetter = false; [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); [DllImport("user32.dll")] static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); _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 static void ToggleCapsLock() { const int KEYEVENTF_EXTENDEDKEY = 0x1; const int KEYEVENTF_KEYUP = 0x2; UnhookWindowsHookEx(_hookID); keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0); keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0); _hookID = SetHook(_proc); } private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { if (lastKeyWasLetter) { if (Control.IsKeyLocked(System.Windows.Forms.Keys.CapsLock)) { ToggleCapsLock(); } lastKeyWasLetter = false; } Keys key = (Keys)Marshal.ReadInt32(lParam); if (key == Keys.Space) { if (!Control.IsKeyLocked(System.Windows.Forms.Keys.CapsLock)) { ToggleCapsLock(); } } else if (key >= Keys.A && key <= Keys.Z) { lastKeyWasLetter = true; } } return CallNextHookEx(_hookID, nCode, wParam, lParam); } } 

Péguelo en el nuevo Program.cs de una aplicación de Windows en Visual Studio para probarlo.

Si intercepta un evento de apertura de tecla para activar y desactivar el locking de mayúsculas, entonces el evento se intercepta antes de que la aplicación lo maneje. Esto significa que al desactivar el Bloqueo de mayúsculas cuando se presiona una tecla de letra, la aplicación que está escribiendo recibirá una letra minúscula, incluso después de un espacio.

Supongo que está tratando de forzar el uso de mayúsculas en la primera letra de cada palabra (y si es así, es posible que deba manejar otras claves, como Devolver también), por lo que mi fragmento solo desactivará el Bloqueo de mayúsculas en la siguiente tecla hacia abajo evento después de una letra que se presiona. Tenga en cuenta que no puede simplemente intentar capturar la clave hacia arriba, ya que cuando escribe rápidamente puede mantener presionada la tecla inicial hasta que presione la siguiente tecla.