类:
class KeyboardHook
{
public event KeyEventHandler KeyDownEvent;
public event KeyPressEventHandler KeyPressEvent;
public event KeyEventHandler KeyUpEvent;
public delegate int HookProc ( int nCode, Int32 wParam, IntPtr lParam) ;
static int hKeyboardHook = 0 ;
public const int WH_KEYBOARD_LL = 13 ;
HookProc KeyboardHookProcedure;
[ StructLayout ( LayoutKind. Sequential) ]
public class KeyboardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
[ DllImport ( "user32.dll" , CharSet = CharSet. Auto, CallingConvention = CallingConvention. StdCall) ]
public static extern int SetWindowsHookEx ( int idHook, HookProc lpfn, IntPtr hInstance, int threadId) ;
[ DllImport ( "user32.dll" , CharSet = CharSet. Auto, CallingConvention = CallingConvention. StdCall) ]
public static extern bool UnhookWindowsHookEx ( int idHook) ;
[ DllImport ( "user32.dll" , CharSet = CharSet. Auto, CallingConvention = CallingConvention. StdCall) ]
public static extern int CallNextHookEx ( int idHook, int nCode, Int32 wParam, IntPtr lParam) ;
[ DllImport ( "kernel32.dll" ) ]
static extern int GetCurrentThreadId ( ) ;
[ DllImport ( "kernel32.dll" ) ]
public static extern IntPtr GetModuleHandle ( string name) ;
public void Start ( )
{
if ( hKeyboardHook == 0 )
{
KeyboardHookProcedure = new HookProc ( KeyboardHookProc) ;
hKeyboardHook = SetWindowsHookEx ( WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle ( System. Diagnostics. Process. GetCurrentProcess ( ) . MainModule. ModuleName) , 0 ) ;
SetWindowsHookEx ( 13 , KeyboardHookProcedure, IntPtr. Zero, GetCurrentThreadId ( ) ) ;
if ( hKeyboardHook == 0 )
{
Stop ( ) ;
throw new Exception ( "安装键盘钩子失败" ) ;
}
}
}
public void Stop ( )
{
bool retKeyboard = true ;
if ( hKeyboardHook != 0 )
{
retKeyboard = UnhookWindowsHookEx ( hKeyboardHook) ;
hKeyboardHook = 0 ;
}
if ( ! ( retKeyboard) ) throw new Exception ( "卸载钩子失败!" ) ;
}
[ 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 ( "user32.dll" , CharSet = CharSet. Auto, CallingConvention = CallingConvention. StdCall) ]
private static extern short GetKeyState ( int vKey) ;
private const int WM_KEYDOWN = 0x100 ;
private const int WM_KEYUP = 0x101 ;
private const int WM_SYSKEYDOWN = 0x104 ;
private const int WM_SYSKEYUP = 0x105 ;
private int KeyboardHookProc ( int nCode, Int32 wParam, IntPtr lParam)
{
if ( ( nCode >= 0 ) && ( KeyDownEvent != null || KeyUpEvent != null || KeyPressEvent != null ) )
{
KeyboardHookStruct MyKeyboardHookStruct = ( KeyboardHookStruct) Marshal. PtrToStructure ( lParam, typeof ( KeyboardHookStruct ) ) ;
if ( KeyDownEvent != null && ( wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) )
{
Keys keyData = ( Keys) MyKeyboardHookStruct. vkCode;
KeyEventArgs e = new KeyEventArgs ( keyData) ;
KeyDownEvent ( this , e) ;
}
if ( KeyPressEvent != null && wParam == WM_KEYDOWN)
{
byte [ ] keyState = new byte [ 256 ] ;
GetKeyboardState ( keyState) ;
byte [ ] inBuffer = new byte [ 2 ] ;
if ( ToAscii ( MyKeyboardHookStruct. vkCode, MyKeyboardHookStruct. scanCode, keyState, inBuffer, MyKeyboardHookStruct. flags) == 1 )
{
KeyPressEventArgs e = new KeyPressEventArgs ( ( char ) inBuffer[ 0 ] ) ;
KeyPressEvent ( this , e) ;
}
}
if ( KeyUpEvent != null && ( wParam == WM_KEYUP || wParam == WM_SYSKEYUP) )
{
Keys keyData = ( Keys) MyKeyboardHookStruct. vkCode;
KeyEventArgs e = new KeyEventArgs ( keyData) ;
KeyUpEvent ( this , e) ;
}
}
return CallNextHookEx ( hKeyboardHook, nCode, wParam, lParam) ;
}
~ KeyboardHook ( )
{
Stop ( ) ;
}
}
使用
private void hook_KeyDown ( object sender, KeyEventArgs e)
{
if ( e. KeyCode. Equals ( Keys. PrintScreen) )
{
}
}
public void startListen ( )
{
myKeyEventHandeler = new KeyEventHandler ( hook_KeyDown) ;
k_hook. KeyDownEvent += myKeyEventHandeler;
k_hook. Start ( ) ;
}
public void stopListen ( )
{
if ( myKeyEventHandeler != null )
{
k_hook. KeyDownEvent -= myKeyEventHandeler;
myKeyEventHandeler = null ;
k_hook. Stop ( ) ;
}
}