Skip to content

Instantly share code, notes, and snippets.

@Stasonix
Created July 26, 2012 08:52
Show Gist options
  • Save Stasonix/3181083 to your computer and use it in GitHub Desktop.
Save Stasonix/3181083 to your computer and use it in GitHub Desktop.
GLOBAL HOOK example C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
namespace WFA
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// ... { GLOBAL HOOK }
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);
[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hInstance);
[DllImport("user32.dll")]
static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
const int WH_KEYBOARD_LL = 13; // Номер глобального LowLevel-хука на клавиатуру
const int WM_KEYDOWN = 0x100; // Сообщения нажатия клавиши
private LowLevelKeyboardProc _proc = hookProc;
private static IntPtr hhook = IntPtr.Zero;
public void SetHook()
{
IntPtr hInstance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
}
public static void UnHook()
{
UnhookWindowsHookEx(hhook);
}
public static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam)
{
if (code >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
//////ОБРАБОТКА НАЖАТИЯ
if (vkCode.ToString() == "162")
{
MessageBox.Show("You pressed a CTR");
}
return (IntPtr)1;
}
else
return CallNextHookEx(hhook, code, (int)wParam, lParam);
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// убираем хук
UnHook();
}
private void Form1_Load(object sender, EventArgs e)
{
// Устанавливаем хук
SetHook();
}
}
}
@L0rdKlappstuhl
Copy link

@Joer89 You are not calling CallNextHookEx in case you find the strings you are writing to your stream you return before that...
You should always call CallNextHookEx. And btw... please use a switch case instead of if /else cascades...

@MrLolthe1st
Copy link

Thanks! 1st of one hundred not working hook examples.

@hoangdao1968
Copy link

What a great example, however I cannot hook lower case characters. Can you help me?

@shmelrad
Copy link

Во время выполнения программы нельзя печатать( что делать?

@romagny13
Copy link

Great. Thanks

@MyelinsheathXD
Copy link

Wohh , thx! finally found!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment