All in Sight Development and Digital Life 2.0

16Mrz/110

KeyHook

ktouch

Ich habe mir mal die Mühe gemacht, eine Klasse zu basteln, welche auf Tastatureingaben reagiert. Dabei werde alle Eingaben eingefangen, welche durch die Tastatur erfolgen. Das Fenster der Anwendung muss also nicht aktiv sein.
Über den angelegten EventHandler kann man diese Eingaben dann einfach mit per Event abfangen.
Die Grundstruktur, auf die dieser Snippet basiert findet ihr hier

 

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace KeyEvent
{
class InterceptKeys
{
///

///
///

public InterceptKeys()
{
this._proc = HookCallback;
SetHook(_proc);
}
///

///
///

~InterceptKeys()
{
UnhookWindowsHookEx(_hookID);
}
///

///
///

public const int WH_KEYBOARD_LL = 13;
///

///
///

public const int WM_KEYDOWN = 0x0100;
///

///
///

public LowLevelKeyboardProc _proc;
///

///
///

public static IntPtr _hookID = IntPtr.Zero;
///

///
///

/// <param name="proc" /> ///
public 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);
}
}
///

///
///

/// <param name="nCode" /> /// <param name="wParam" /> /// <param name="lParam" /> ///
public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
///

///
///

/// <param name="nCode" /> /// <param name="wParam" /> /// <param name="lParam" /> ///
public IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode &gt;= 0 &amp;&amp; wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
OnInput(new KeyEventArgs((Keys)vkCode));
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
///

///
///

/// <param name="idHook" /> /// <param name="lpfn" /> /// <param name="hMod" /> /// <param name="dwThreadId" /> ///
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
///

///
///

/// <param name="hhk" /> ///
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
///

///
///

/// <param name="hhk" /> /// <param name="nCode" /> /// <param name="wParam" /> /// <param name="lParam" /> ///
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, IntPtr lParam);
///

///
///

/// <param name="lpModuleName" /> ///
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);

///

///
///

/// <param name="sender" /> /// <param name="e" /> public delegate void KeyEventHandler(object sender, KeyEventArgs e);
///

///
///

public event KeyEventHandler Input;
///

/// Invoke the Changed event; called whenever list changes
///

/// <param name="e" /> protected void OnInput(KeyEventArgs e)
{
if (this.Input == null) return;
System.ComponentModel.AsyncOperationManager.CreateOperation(null).Post(new System.Threading.SendOrPostCallback(delegate(object obj) { try { this.Input(this, e); } catch { } }), null);
}
}
}