I am using “SetWindowsHook Ex” to hook into keyboard input events and does the keystroke...
Code:
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
public class WindowsHookHelper
{
public delegate IntPtr HookDelegate(
Int32 Code, IntPtr wParam, IntPtr lParam);
[DllImport("User32.dll")]
public static extern IntPtr CallNextHookEx(
IntPtr hHook, Int32 nCode, IntPtr wParam, IntPtr lParam);
[DllImport("User32.dll")]
public static extern IntPtr UnhookWindowsHookEx(IntPtr hHook);
[DllImport("User32.dll")]
public static extern IntPtr SetWindowsHookEx(
Int32 idHook, HookDelegate lpfn, IntPtr hmod,
Int32 dwThreadId);
}
// Implement the IService service contract in a service class.
public class KeyStrokeFileSavedService : IKeyStrokeFileSavedService, IDisposable
{
public event EventHandler<EventArgs> KeyBoardKeyPressed;
//public event EventHandler KeyBoardKeyPressed;
private WindowsHookHelper.HookDelegate keyBoardDelegate;
private IntPtr keyBoardHandle;
private const Int32 WH_KEYBOARD_LL = 13;
private const Int32 WH_KEYBOARD = 2;
private bool disposed;
public KeyStrokeFileSavedService()
{
keyBoardDelegate = KeyboardHookDelegate
;
keyBoardHandle = WindowsHookHelper.SetWindowsHookEx(
WH_KEYBOARD, keyBoardDelegate, IntPtr.Zero, 0);
}
[DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]
static extern void CopyMemory(string c, IntPtr lParam, uint len);
public IntPtr KeyboardHookDelegate(Int32 Code, IntPtr wParam, IntPtr lParam)
{
if ((Code >= 0) && (KeyBoardKeyPressed != null))
{
KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
if (KeyBoardKeyPressed != null)
{
char keyData = (char)MyKeyboardHookStruct.vkCode;
//preKeys.Add(keyData);
using (StreamWriter sw = new StreamWriter("EnteredKeyStrokes.txt"))
{
string ch = "hjhk";
sw.WriteLine("{0}", ch);
sw.WriteLine("{0}", keyData);
}
}
}
return WindowsHookHelper.CallNextHookEx(keyBoardHandle, Code, wParam, lParam);
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (keyBoardHandle != IntPtr.Zero)
{
WindowsHookHelper.UnhookWindowsHookEx(
keyBoardHandle);
}
disposed = true;
}
}
~KeyStrokeFileSavedService()
{
Dispose(false);
}
}
Comment