First off this is obviously my first post on MPGH.net and i wanna post something actually contributory.
To create a Basic Keyboard hook you are going to need to understand basic C# and .NET basics.
To start make a new Windows Form project and name it whatever you want. Then go into the Forms Code and add the following namespaces
Code:
using System.IO;
using System****ntime.InteropServices;
using Microsoft.Win32;
using System.Diagnostics;
Now that you have those you want to add a new struct above your main form class.
Code:
[StructLayout(LayoutKind.Sequential)]
public struct KeyHook
{
public Keys key;
public int Code;
public int flags;
public int time;
public IntPtr extra;
}
Now that you have a new struct you want to go into your forms class and add the following Fields.
Code:
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool UnhookWindowsHookEx(IntPtr hook);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string name);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern short GetAsyncKeyState(Keys key);
private IntPtr ptrHook;
private LowLevelKeyboardProc objKeyboardProcess;
Now in your forms class add the following void
Code:
private IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp)
{
if (nCode >= 0)
{
KeyHook objKeyInfo = (KeyHook)Marshal.PtrToStructure(lp, typeof(KeyHook));
}
//this.TopMost = true;
return CallNextHookEx(ptrHook, nCode, wp, lp);
}
now into your forms main void default (Form1()) or
Code:
ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule;
objKeyboardProcess = new LowLevelKeyboardProc(captureKey);
ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0);
Now go to your Forms Designer.cs and add the name spaces
then in the designers Desposing() bool replace it with
Code:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
if (ptrHook != IntPtr.Zero)
{
UnhookWindowsHookEx(ptrHook);
ptrHook = IntPtr.Zero;
}
base.Dispose(disposing);
}
Now we have added the code to catch the keybaord hooks to use this to do functions or other stuff we go to the CaptureKey void
To Disable a Key's input you add the code
Code:
private IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp)
{
if (nCode >= 0)
{
KeyHook objKeyInfo = (KeyHook)Marshal.PtrToStructure(lp, typeof(KeyHook));
if (objKeyInfo.key == /*Key to disable*/)
return (IntPtr)1;
}
//this.TopMost = true;
return CallNextHookEx(ptrHook, nCode, wp, lp);
}
To have it do a function do
Code:
private IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp)
{
if (nCode >= 0)
{
KeyHook objKeyInfo = (KeyHook)Marshal.PtrToStructure(lp, typeof(KeyHook));
//if (objKeyInfo.key == /*Key*/)
Application.Exit();
}
//this.TopMost = true;
return CallNextHookEx(ptrHook, nCode, wp, lp);
}
That is basic Keyboard Hooks, You can do many things with this code.
-Kantanomo leaving it short and sweet