procesamiento del teclado
Enganche de teclado global, de la siguiente manera, puede obtener los datos del gancho de teclado en el cuadro de texto.
usando System;
usando System.Runtime.InteropServices;
usando System.Reflection;
usando System.Threading; p>
usando System.Runtime.InteropServices;
usando System.Reflection;
usando System.Threading;
p>usando System.Windows. Formularios;
usando System.Diagnostics;
usando System.Collections.Generic;
espacio de nombres HookGlobal
{
/// lt; resumengt;
/// Esta clase le permite obtener todos los eventos de teclado de un programa en ejecución
/// Y generar un evento .NET con KeyEventArgs. y parámetros MouseEventArgs para que pueda utilizar fácilmente esta información
/// lt;/summarygt;
/// commentsgt; Modificación: lihx
/// Hora de modificación: 04.11.8
/// lt;/remarksgt
public class KeyBordHook
{
const privada int WM_KEYDOWN = 0x100;
const privada int WM_KEYUP = 0x101
const privada WM_SYSKEYDOWN = 0x104; > private const int WM_SYSKEYUP = 0x105;
//Eventos globales
evento público KeyEventHandler OnKeyDownEvent
evento público KeyEventHandler OnKeyUpEvent; evento público KeyPressEventHandler OnKeyPressEvent;
static int hKeyboardHook = 0; // Controlador de gancho de teclado
// Constantes del mouse
public const int WH_KEYBOARD_LL = 13; constante de enlace de teclado
HookProc KeyboardHookProcedure; //Declarar el tipo de evento de enlace de teclado.
//Declarar la estructura de clasificación del tipo de enlace de teclado
[StructLayout( LayoutKind.Sequential)]
clase pública KeyboardHookStruct
{
public int VkCode
; //Representa un código de teclado virtual entre 1 y 254
public int scanCode; //Representa un código de escaneo de hardware
public int flags;
public int time;
public int dwExtraInfo;
}
//Función para instalar el gancho
[DllImport("user32.dll " , CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
/ /Función para desenganchar
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook ) ;
//Siguiente función enlazada
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
[DllImport("user32")]
public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState);
[DllImport("user32")]
public static extern int GetKeyboardState(byte[] pbKeyState);
[DllImport("kernel32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
IntPtr externo estático privado GetModuleHandle(cadena lpModuleName);
p
delegado público int HookProc(int nCode, Int32 wParam, IntPtr lParam);
//Teclas previamente presionadas
public Keysgt; preKeys = new Keysgt () ;
/// lt;summarygt;
/// El constructor MoCui construye una instancia de la clase actual y la ejecuta automáticamente
// /lt; /summarygt;
public KeyBordHook()
{
Inicio()
}
// Destructor
~KeyBordHook()
{
Stop()
}
inicio público vacío. ()
{
//Instalar gancho de teclado
if (hKeyboardHook == 0)
{
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
//hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
Proceso curProcess = Process.GetCurrentProcess();
ProcessModule curModule = curProcess.MainModule;
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(curModule .ModuleName), 0 );
if (hKeyboardHook == 0)
{
Stop();
lanza una nueva excepción ("SetWindowsHookEx falló .");
}
}
}
public void Stop()
{
bool retKeyboard = true;
if (hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
//Si no se puede eliminar el gancho
if (!(retKeyboard)) throw new Exception("UnhookWindowsHookEx falló.");
}
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if ((nCode gt; = 0) amp; amp; (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null))
{
KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
//Cuando hay OnKeyDownEvent o OnKeyPressEvent no es nulo, ctrl alt shift keyup Cuando preKeys
//La tecla correspondiente aumenta
if ((OnKeyDownEvent != null || OnKeyPressEvent != null) amp; amp; (wParam == WM_KEYDOWN | | wParam == WM_SYSKEYDOWN))
{
Claves keyData = (Keys)MyKeyboardHookStruct.vkCode
if (IsCtrlAltShiftKeys(keyData) amp; amp; preKeys .IndexOf (keyData) == -1)
{
preKeys.Add(keyData);
}
}
//Elevar OnKeyDownEvent
if (OnKeyDownEvent != null amp; amp; (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
{
Claves keyData = (Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));
OnKeyDownEvent(this, e);
}
//Elevar OnKeyPressEvent
if (OnKeyPressEvent != null amp; amp; wParam == WM_KEYDOWN)
{
byte[] keyState = nuevo byte[256];
GetKeyboardState(keyState);
byte[] inBuffer = nuevo byte[2];
if (ToAscii(MyKeyboardHookStruct.vkCode,
MyKeyboardHookStruct.scanCode,
keyState,
inBuffer,
MyKeyboardHookStruct. banderas) == 1)
{
KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
OnKeyPressEvent(this, e);
}
}
//Cuando hay OnKeyDownEvent o OnKeyPressEvent no es nulo, ctrl alt shift keyup preKeys
// El la clave correspondiente se elimina
si ((OnKeyDownEvent !=
nulo || OnKeyPressEvent != nulo) amp; (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
{
Claves keyData = (Claves)MyKeyboardHookStruct.vkCode;
if (IsCtrlAltShiftKeys(keyData))
{
for (int i = preKeys.Count - 1; i gt; = 0; i--)
{
if (preKeys[i] == keyData)
{
preKeys.RemoveAt(i);
}
}
}
}
//Activar OnKeyUpEvent
if (OnKeyUpEvent != null & (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
{
Claves keyData = (Claves)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));
OnKeyUpEvent(this, e
}
}
return; CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
Claves privadas GetDownKeys(Teclas clave)
{
Claves rtnKey = Keys.None;
foreach (Keys keyTemp en preKeys)
{
cambiar (keyTemp)
{
case Keys.LControlKey:
case Keys.RControlKey:
rtnKey = rtnKeys.Control;
break;
case Keys.LMenu:
case Keys.RMenu:
rtnKey = rtnKeys.Alt
break; >
caso Keys.LShiftKey:
caso Keys.RShiftKey:
rtnKey = rtnKeys.Shift;
romper;
predeterminado:
romper
}
}
rtnKey = rtnKey | rtnKey;
}
privado booleano IsCtrlAltShiftKeys(tecla Teclas)
{
interruptor (tecla)
{
caso Teclas.LControlKey:
caso Teclas.RControlKey:
caso Teclas.LMenu:
caso Teclas.RMenu:
case Keys.LShiftKey:
case Keys.RShiftKey:
devuelve verdadero
predeterminado:
devuelve; falso;
}
}
}
}