Here's a simple project on how to use Windows Hooks in C#. This example can disable default windows responses from the keyboard using low level keyboard windows hooks. For example, key combinations such as alt+tab, alt+f4 and others are disabled, hence this can be useful for computer cafe lock and unlock automation softwares. Here are the important parts of the code:
// DLL imports
[DllImport("user32",
EntryPoint = "SetWindowsHookExA",
CharSet = CharSet.Ansi,
SetLastError = true,
ExactSpelling = true)]
public static extern int SetWindowsHookEx(int idHook,
LowLevelKeyboardProcDelegate lpfn,
int hMod,
int dwThreadId);
[DllImport("user32",
EntryPoint = "UnhookWindowsHookEx",
CharSet = CharSet.Ansi,
SetLastError = true,
ExactSpelling = true)]
public static extern int UnhookWindowsHookEx(int hHook);
public delegate int LowLevelKeyboardProcDelegate(int nCode,
int wParam,
ref KBDLLHOOKSTRUCT lParam);
[DllImport("user32",
EntryPoint = "CallNextHookEx",
CharSet = CharSet.Ansi,
SetLastError = true,
ExactSpelling = true)]
public static extern int CallNextHookEx(int hHook,
int nCode,
int wParam,
ref KBDLLHOOKSTRUCT lParam);
public const int WH_KEYBOARD_LL = 13;
/*code needed to disable start menu*/
[DllImport("user32.dll")]
private static extern int FindWindow(string className, string windowText);
[DllImport("user32.dll")]
private static extern int ShowWindow(int hwnd, int command);
private const int SW_HIDE = 0;
private const int SW_SHOW = 1;
public struct KBDLLHOOKSTRUCT
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
public static int intLLKey;
public int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam)
{
bool blnEat = false;
switch (wParam)
{
case 256:
case 257:
case 260:
case 261:
//Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key,
blnEat = ((lParam.vkCode == 9) || (lParam.flags == 32)) |
((lParam.vkCode == 27) || (lParam.flags == 32)) |
((lParam.vkCode == 27) || (lParam.flags == 0)) |
((lParam.vkCode == 91) || (lParam.flags == 1)) |
((lParam.vkCode == 92) || (lParam.flags == 1)) |
((lParam.vkCode == 73) || (lParam.flags == 0));
break;
}
if (blnEat == true)
{
return 1;
}
else
{
return CallNextHookEx(0, nCode, wParam, ref lParam);
}
}
public void KillStartMenu()
{
int hwnd = FindWindow("Shell_TrayWnd", "");
ShowWindow(hwnd, SW_HIDE);
}
You can implement them like this:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked == true )
{
intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,
System.Runtime.InteropServices.Marshal.GetHINSTANCE(
System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(),
0);
}
else
{
intLLKey = UnhookWindowsHookEx(intLLKey);
}
}
You can also add it on the Form Load event:
private void Form1_Load(object sender, EventArgs e)
{
intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,
System.Runtime.InteropServices.Marshal.GetHINSTANCE(
System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(),
0);
}
Download the prototype in from the attachments. The proto.zip file contains the source code, while the release.zip file contains the compiled binaries. Use 'bangonkali' as password without the single quotation marks included.