C # .NET global keyboard hook (HOOK)

xiaoxiao2021-03-06  14

/// If there is no special explanation, the technical articles published by myself are original. If anyone is quoted, please indicate the source and contain this statement /// to the unknown open source hero. 2005-03-09

Using system.windows.forms; using system.runtime.interopservices; using system.reflection;

namespace HookDll {public class HookDll {private KBDLLHOOKSTRUCT kbdllhs; private IntPtr iHookHandle = IntPtr.Zero; private GCHandle _hookProcHandle; public delegate IntPtr HookProc (int nCode, IntPtr wParam, IntPtr lParam);

[DllImport ( "user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SetWindowsHookEx (int hookid, HookProc pfnhook, IntPtr hinst, int threadid); [DllImport ( "user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern bool UnhookWindowsHookEx (IntPtr hhook); [DllImport ( "user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern IntPtr CallNextHookEx (IntPtr hhook, int code, IntPtr wparam, INTPTR LPARAM;

[DLLIMPORT ("kernel32.dll", charset = charset.auto, callingconvention = callingconvention.stdcall)] private static extern INTPTR getModuleHandle (String lpmodulen);

[DLLIMPORT ("kernel32.dll", entrypoint = "rtLmoveMemory)] Public static extern void CopyMemory (INTPTR DESTINATION, INT LENGTH);

private const int WH_KEYBOARD = 13; public void DisableKBDHook () {try {if (iHookHandle = IntPtr.Zero!) {UnhookWindowsHookEx (iHookHandle);} _hookProcHandle.Free (); iHookHandle = IntPtr.Zero;} catch {return;}}

public void EnableKBDHook () {HookProc hookProc = new HookProc (KBDDelegate); _hookProcHandle = GCHandle.Alloc (hookProc); iHookHandle = SetWindowsHookEx (WH_KEYBOARD, hookProc, GetModuleHandle ( "HookDll.dll"), 0); if (iHookHandle == IntPtr .Zero {throw new system.exception ("Error, hook failed!");}}

public IntPtr KBDDelegate (int iCode, IntPtr wParam, IntPtr lParam) {kbdllhs = new KBDLLHOOKSTRUCT (); CopyMemory (ref kbdllhs, lParam, 20); // result here ^ _ ^ int iHookCode = kbdllhs.vkCode;

Disablekbdhook (); enablekbdhook (); Return CallnexthooKex (iHOOKHANDLE, ICODE, WPARAM, LPARAM);}}

[Structlayout (layoutkind.sequential)] public struct kbdllhooktruct {public int vkcode; public int scancode; public int flags; public int tent; public int dwextrainfo;}}

转载请注明原文地址:https://www.9cbs.com/read-48842.html

New Post(0)