键盘钩子
基于VB的键盘钩子算法的实现
输入 的运作 ,然 后根据 虚拟键 表判断 按键 的类 型 , 最 后把 得到的准 确的按键类 型输 出。
21 键 盘 工作 流 程 图 ( 1 . 图 )
少 的一 部分 在使 用计算机 进行操 作的 时候 , 经常会 使用 到一些快捷 的操作方 式或获取 键盘 的按键 信息 . 例 如使用 快捷 键来实 现复 制 、粘 贴或 是否 按 了 E c s、
2 键 盘 模 块 ( 2 . 3 图 )
机 息 . 可以强制结 束消息 的传递 。 还 总 2 键 盘 钩 子 的 工作 原 理 第
三
一
3 键 盘 钩 子 实现 算 法
使 用 不 同 的 W idw P 函 数 获 取 键 盘 的 动 作 n o sA I
固
9 1 6
簟 麓纛 蠢
T b 键 a Si t hf 键
vK y sae b e e c p v Ky  ̄ e be H vKy be
vKy rn b eP i t vK y b 2 6 5 9 7
空 格 键 等 操 作 信 息 。 捷 键 具 有 操 作 简单 、 便 、 捷 快 方 快 等优 点 . 就 需 要 我 们 在 编 写 程 序 代 码 的 过 程 中增 加 这 对 键 盘 的 按 键 进 行 判 断 . 个 过 程 就 是 所 谓 的 键 盘 钩 这 子 功 能 利 用 V 在 B来 编 写 所 需 要 的 应 用 程 序 时 . 于 由 V B无 法 直 接 对 系 统 的 注 册 表 进 行 操 作 对 于 此 类 操
图 1 键 盘 工 作 流程 图
22 键 盘的虚拟键 简表 ( 1 . 表 )
在 表 1中 . 一 列 是 系 统 各 个 键 中 的 名 称 . 二 第 第
C#简单鼠标键盘钩子KMHook
C#简单⿏标键盘钩⼦KMHook简介:由三个⽂件构成Pinvo.cs、KeyboardHook.cs、MouseHook.cs Pinvo.cs 是KeyboardHook与MouseHook需要的⼀些常量消息的定义 KeyboardHook 是实现的⼀个WH_KEYBOARD_LL类型的全局键盘钩⼦(SetWindowsHookExA函数最后⼀个参数threadId=0) MouseHook 是实现的⼀个WH_MOUSE_LL类型的全局⿏标按键钩⼦(SetWindowsHookExA函数最后⼀个参数threadId=0) Pinvo1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace KMHook8 {9public class HookType10 {11public const int WH_CALLWNDPROC = 4;12public const int WH_KEYBOARD_LL = 13;13public const int WH_MOUSE_LL = 14;14 }1516public class Messages17 {18public const int WM_MOUSEHOVER = 0x02A1;19public const int WM_MOUSELEAVE = 0x02A3;20public const int WM_DEVICECHANGE = 0x0219;21public const int WM_DDE_FIRST = 0x03E0;22public const int WM_BB_ENABLE = 0x00000001;23public const int WM_BB_BLURREGION = 0x00000002;24public const int WM_BB_TRANSITIONONMAXIMIZED = 0x00000004;25public const int WM_CLOAKED_APP = 0x00000001;26public const int WM_CLOAKED_SHELL = 0x00000002;27public const int WM_CLOAKED_INHERITED = 0x00000004;28public const int WM_TNP_RECTDESTINATION = 0x00000001;29public const int WM_TNP_RECTSOURCE = 0x00000002;30public const int WM_TNP_OPACITY = 0x00000004;31public const int WM_TNP_VISIBLE = 0x00000008;32public const int WM_TNP_SOURCECLIENTAREAONLY = 0x00000010;33public const int WM_SIT_DISPLAYFRAME = 0x00000001;34public const int WM_HELP = 0x0011;35public const int WM_IME_REPORT = 0x0280;36public const int WM_CONVERTREQUESTEX = 0x0109;37public const int WM_WNT_CONVERTREQUESTEX = 0x0109;38public const int WM_CONVERTREQUEST = 0x010A;39public const int WM_CONVERTRESULT = 0x010B;40public const int WM_INTERIM = 0x010C;41public const int WM_IMEKEYDOWN = 0x290;42public const int WM_IMEKEYUP = 0x291;43public const int WM_RASDIALEVENT = 0xCCCD;44public const int WM_CONTEXTMENU = 0x007B;45public const int WM_UNICHAR = 0x0109;46public const int WM_PRINTCLIENT = 0x0318;47public const int WM_NOTIFY = 0x004E;48public const int WM_HANDLED_MASK = 0x1;49public const int WM_TABLET_DEFBASE = 0x02C0;50public const int WM_TABLET_MAXOFFSET = 0x20;51public const int WM_NULL = 0x0000;52public const int WM_CREATE = 0x0001;53public const int WM_DESTROY = 0x0002;54public const int WM_MOVE = 0x0003;55public const int WM_SIZE = 0x0005;56public const int WM_ACTIVATE = 0x0006;57public const int WM_SETFOCUS = 0x0007;58public const int WM_KILLFOCUS = 0x0008;59public const int WM_ENABLE = 0x000A;60public const int WM_SETREDRAW = 0x000B;61public const int WM_SETTEXT = 0x000C;62public const int WM_GETTEXT = 0x000D;63public const int WM_GETTEXTLENGTH = 0x000E;64public const int WM_PAINT = 0x000F;65public const int WM_CLOSE = 0x0010;66public const int WM_QUERYENDSESSION = 0x0011;70public const int WM_ERASEBKGND = 0x0014;71public const int WM_SYSCOLORCHANGE = 0x0015;72public const int WM_SHOWWINDOW = 0x0018;73public const int WM_WININICHANGE = 0x001A;74public const int WM_DEVMODECHANGE = 0x001B;75public const int WM_ACTIVATEAPP = 0x001C;76public const int WM_FONTCHANGE = 0x001D;77public const int WM_TIMECHANGE = 0x001E;78public const int WM_CANCELMODE = 0x001F;79public const int WM_SETCURSOR = 0x0020;80public const int WM_MOUSEACTIVATE = 0x0021;81public const int WM_CHILDACTIVATE = 0x0022;82public const int WM_QUEUESYNC = 0x0023;83public const int WM_GETMINMAXINFO = 0x0024;84public const int WM_PAINTICON = 0x0026;85public const int WM_ICONERASEBKGND = 0x0027;86public const int WM_NEXTDLGCTL = 0x0028;87public const int WM_SPOOLERSTATUS = 0x002A;88public const int WM_DRAWITEM = 0x002B;89public const int WM_MEASUREITEM = 0x002C;90public const int WM_DELETEITEM = 0x002D;91public const int WM_VKEYTOITEM = 0x002E;92public const int WM_CHARTOITEM = 0x002F;93public const int WM_SETFONT = 0x0030;94public const int WM_GETFONT = 0x0031;95public const int WM_SETHOTKEY = 0x0032;96public const int WM_GETHOTKEY = 0x0033;97public const int WM_QUERYDRAGICON = 0x0037;98public const int WM_COMPAREITEM = 0x0039;99public const int WM_GETOBJECT = 0x003D;100public const int WM_COMPACTING = 0x0041;101public const int WM_COMMNOTIFY = 0x0044;102public const int WM_WINDOWPOSCHANGING = 0x0046;103public const int WM_WINDOWPOSCHANGED = 0x0047;104public const int WM_POWER = 0x0048;105public const int WM_COPYDATA = 0x004A;106public const int WM_CANCELJOURNAL = 0x004B;107public const int WM_INPUTLANGCHANGEREQUEST = 0x0050; 108public const int WM_INPUTLANGCHANGE = 0x0051;109public const int WM_TCARD = 0x0052;110public const int WM_USERCHANGED = 0x0054;111public const int WM_NOTIFYFORMAT = 0x0055;112public const int WM_STYLECHANGING = 0x007C;113public const int WM_STYLECHANGED = 0x007D;114public const int WM_DISPLAYCHANGE = 0x007E;115public const int WM_GETICON = 0x007F;116public const int WM_SETICON = 0x0080;117public const int WM_NCCREATE = 0x0081;118public const int WM_NCDESTROY = 0x0082;119public const int WM_NCCALCSIZE = 0x0083;120public const int WM_NCHITTEST = 0x0084;121public const int WM_NCPAINT = 0x0085;122public const int WM_NCACTIVATE = 0x0086;123public const int WM_GETDLGCODE = 0x0087;124public const int WM_SYNCPAINT = 0x0088;125public const int WM_NCMOUSEMOVE = 0x00A0;126public const int WM_NCLBUTTONDOWN = 0x00A1;127public const int WM_NCLBUTTONUP = 0x00A2;128public const int WM_NCLBUTTONDBLCLK = 0x00A3;129public const int WM_NCRBUTTONDOWN = 0x00A4;130public const int WM_NCRBUTTONUP = 0x00A5;131public const int WM_NCRBUTTONDBLCLK = 0x00A6;132public const int WM_NCMBUTTONDOWN = 0x00A7;133public const int WM_NCMBUTTONUP = 0x00A8;134public const int WM_NCMBUTTONDBLCLK = 0x00A9;135public const int WM_NCXBUTTONDOWN = 0x00AB;136public const int WM_NCXBUTTONUP = 0x00AC;137public const int WM_NCXBUTTONDBLCLK = 0x00AD;138public const int WM_INPUT_DEVICE_CHANGE = 0x00FE;139public const int WM_INPUT = 0x00FF;140public const int WM_KEYFIRST = 0x0100;141public const int WM_CHAR = 0x0102;142public const int WM_DEADCHAR = 0x0103;143public const int WM_SYSCHAR = 0x0106;144public const int WM_SYSDEADCHAR = 0x0107;145public const int WM_KEYLAST = 0x0109;146public const int WM_IME_STARTCOMPOSITION = 0x010D; 147public const int WM_IME_ENDCOMPOSITION = 0x010E;148public const int WM_IME_COMPOSITION = 0x010F;149public const int WM_IME_KEYLAST = 0x010F;150public const int WM_INITDIALOG = 0x0110;154public const int WM_HSCROLL = 0x0114;155public const int WM_VSCROLL = 0x0115;156public const int WM_INITMENU = 0x0116;157public const int WM_INITMENUPOPUP = 0x0117;158public const int WM_GESTURE = 0x0119;159public const int WM_GESTURENOTIFY = 0x011A;160public const int WM_MENUSELECT = 0x011F;161public const int WM_MENUCHAR = 0x0120;162public const int WM_ENTERIDLE = 0x0121;163public const int WM_MENURBUTTONUP = 0x0122;164public const int WM_MENUDRAG = 0x0123;165public const int WM_MENUGETOBJECT = 0x0124;166public const int WM_UNINITMENUPOPUP = 0x0125;167public const int WM_MENUCOMMAND = 0x0126;168public const int WM_CHANGEUISTATE = 0x0127;169public const int WM_UPDATEUISTATE = 0x0128;170public const int WM_QUERYUISTATE = 0x0129;171public const int WM_CTLCOLORMSGBOX = 0x0132;172public const int WM_CTLCOLOREDIT = 0x0133;173public const int WM_CTLCOLORLISTBOX = 0x0134;174public const int WM_CTLCOLORBTN = 0x0135;175public const int WM_CTLCOLORDLG = 0x0136;176public const int WM_CTLCOLORSCROLLBAR = 0x0137;177public const int WM_CTLCOLORSTATIC = 0x0138;178public const int WM_MOUSEFIRST = 0x0200;179//public const int WM_LBUTTONDBLCLK = 0x0203;180//public const int WM_RBUTTONDBLCLK = 0x0206;181//public const int WM_MBUTTONDBLCLK = 0x0209;182public const int WM_MOUSEWHEEL = 0x020A;183public const int WM_XBUTTONDOWN = 0x020B;184public const int WM_XBUTTONUP = 0x020C;185public const int WM_XBUTTONDBLCLK = 0x020D;186public const int WM_MOUSEHWHEEL = 0x020E;187public const int WM_MOUSELAST = 0x020E;188public const int WM_PARENTNOTIFY = 0x0210;189public const int WM_ENTERMENULOOP = 0x0211;190public const int WM_EXITMENULOOP = 0x0212;191public const int WM_NEXTMENU = 0x0213;192public const int WM_SIZING = 0x0214;193public const int WM_CAPTURECHANGED = 0x0215;194public const int WM_MOVING = 0x0216;195public const int WM_POWERBROADCAST = 0x0218;196public const int WM_MDICREATE = 0x0220;197public const int WM_MDIDESTROY = 0x0221;198public const int WM_MDIACTIVATE = 0x0222;199public const int WM_MDIRESTORE = 0x0223;200public const int WM_MDINEXT = 0x0224;201public const int WM_MDIMAXIMIZE = 0x0225;202public const int WM_MDITILE = 0x0226;203public const int WM_MDICASCADE = 0x0227;204public const int WM_MDIICONARRANGE = 0x0228;205public const int WM_MDIGETACTIVE = 0x0229;206public const int WM_MDISETMENU = 0x0230;207public const int WM_ENTERSIZEMOVE = 0x0231;208public const int WM_EXITSIZEMOVE = 0x0232;209public const int WM_DROPFILES = 0x0233;210public const int WM_MDIREFRESHMENU = 0x0234;211public const int WM_POINTERDEVICECHANGE = 0x238;212public const int WM_POINTERDEVICEINRANGE = 0x239;213public const int WM_POINTERDEVICEOUTOFRANGE = 0x23A; 214public const int WM_TOUCH = 0x0240;215public const int WM_NCPOINTERUPDATE = 0x0241;216public const int WM_NCPOINTERDOWN = 0x0242;217public const int WM_NCPOINTERUP = 0x0243;218public const int WM_POINTERUPDATE = 0x0245;219public const int WM_POINTERDOWN = 0x0246;220public const int WM_POINTERUP = 0x0247;221public const int WM_POINTERENTER = 0x0249;222public const int WM_POINTERLEAVE = 0x024A;223public const int WM_POINTERACTIVATE = 0x024B;224public const int WM_POINTERCAPTURECHANGED = 0x024C; 225public const int WM_TOUCHHITTESTING = 0x024D;226public const int WM_POINTERWHEEL = 0x024E;227public const int WM_POINTERHWHEEL = 0x024F;228public const int WM_POINTERROUTEDTO = 0x0251;229public const int WM_POINTERROUTEDAWAY = 0x0252;230public const int WM_POINTERROUTEDRELEASED = 0x0253; 231public const int WM_IME_SETCONTEXT = 0x0281;232public const int WM_IME_NOTIFY = 0x0282;233public const int WM_IME_CONTROL = 0x0283;234public const int WM_IME_COMPOSITIONFULL = 0x0284;237public const int WM_IME_REQUEST = 0x0288;238public const int WM_IME_KEYDOWN = 0x0290;239public const int WM_IME_KEYUP = 0x0291;240public const int WM_NCMOUSEHOVER = 0x02A0;241public const int WM_NCMOUSELEAVE = 0x02A2;242public const int WM_WTSSESSION_CHANGE = 0x02B1;243public const int WM_TABLET_FIRST = 0x02;244public const int WM_TABLET_LAST = 0x02;245public const int WM_DPICHANGED = 0x02E0;246public const int WM_DPICHANGED_BEFOREPARENT = 0x02E2;247public const int WM_DPICHANGED_AFTERPARENT = 0x02E3;248public const int WM_GETDPISCALEDSIZE = 0x02E4;249public const int WM_CUT = 0x0300;250public const int WM_COPY = 0x0301;251public const int WM_PASTE = 0x0302;252public const int WM_CLEAR = 0x0303;253public const int WM_UNDO = 0x0304;254public const int WM_RENDERFORMAT = 0x0305;255public const int WM_RENDERALLFORMATS = 0x0306;256public const int WM_DESTROYCLIPBOARD = 0x0307;257public const int WM_DRAWCLIPBOARD = 0x0308;258public const int WM_PAINTCLIPBOARD = 0x0309;259public const int WM_VSCROLLCLIPBOARD = 0x030A;260public const int WM_SIZECLIPBOARD = 0x030B;261public const int WM_ASKCBFORMATNAME = 0x030C;262public const int WM_CHANGECBCHAIN = 0x030D;263public const int WM_HSCROLLCLIPBOARD = 0x030E;264public const int WM_QUERYNEWPALETTE = 0x030F;265public const int WM_PALETTEISCHANGING = 0x0310;266public const int WM_PALETTECHANGED = 0x0311;267public const int WM_HOTKEY = 0x0312;268public const int WM_PRINT = 0x0317;269public const int WM_APPCOMMAND = 0x0319;270public const int WM_THEMECHANGED = 0x031A;271public const int WM_CLIPBOARDUPDATE = 0x031D;272public const int WM_DWMCOMPOSITIONCHANGED = 0x031E;273public const int WM_DWMNCRENDERINGCHANGED = 0x031F;274public const int WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320; 275public const int WM_DWMWINDOWMAXIMIZEDCHANGE = 0x0321;276public const int WM_DWMSENDICONICTHUMBNAIL = 0x0323;277public const int WM_DWMSENDICONICLIVEPREVIEWBITMAP = 0x0326; 278public const int WM_GETTITLEBARINFOEX = 0x033F;279public const int WM_HANDHELDFIRST = 0x0358;280public const int WM_HANDHELDLAST = 0x035F;281public const int WM_AFXFIRST = 0x0360;282public const int WM_AFXLAST = 0x037F;283public const int WM_PENWINFIRST = 0x0380;284public const int WM_PENWINLAST = 0x038F;285public const int WM_APP = 0x8000;286public const int WM_USER = 0x0400;287public const int WM_CT_REPEAT_FIRST_FIELD = 0x10;288public const int WM_CT_BOTTOM_FIELD_FIRST = 0x20;289public const int WM_CT_TOP_FIELD_FIRST = 0x40;290public const int WM_CT_INTERLACED = 0x80;291public const int WM_MAX_VIDEO_STREAMS = 0x3;292public const int WM_MAX_STREAMS = 0x3;293294public const int WM_KEYDOWN = 0x100;295public const int WM_KEYUP = 0x101;296public const int WM_SYSKEYDOWN = 0x104;297public const int WM_SYSKEYUP = 0x105;298299public const int WM_MOUSEMOVE = 0x200;300public const int WM_LBUTTONDOWN = 0x201;301public const int WM_RBUTTONDOWN = 0x204;302public const int WM_MBUTTONDOWN = 0x207;303public const int WM_LBUTTONUP = 0x202;304public const int WM_RBUTTONUP = 0x205;305public const int WM_MBUTTONUP = 0x208;306public const int WM_LBUTTONDBLCLK = 0x203;307public const int WM_RBUTTONDBLCLK = 0x206;308public const int WM_MBUTTONDBLCLK = 0x209;309 }310 }KeyboardHookusing System;using System.Runtime.InteropServices;public class KeyboardHook : IDisposable{[DllImport("user32.dll")]private static extern int SetWindowsHookExA(int idHook, KeyboardDelegateHandler lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll")]private static extern int CallNextHookEx(int idHook, int nCode, int wParam, KeyData lParam);[DllImport("user32.dll")]public static extern bool UnhookWindowsHookEx(int idHook);private int hookType = 0;private delegate int KeyboardDelegateHandler(int nCode, int wParam, KeyData lParam);public delegate bool KeyDelegate(KeyData keyData, int message);public delegate bool KeyUpUpDelegate(KeyData keyData);public delegate bool KeyDownDelegate(KeyData keyData);public event KeyDelegate keyEvent;public event KeyUpUpDelegate keyUpEvent;public event KeyUpUpDelegate keyDownEvent;public bool IsHooked{get{if (hookType != 0){return true;}return false;}}///<summary>/// vkCode 表⽰1到254间的虚拟键盘码/// scanCode 表⽰硬件扫描码///</summary>[StructLayout(LayoutKind.Sequential)]public class KeyData{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}public void SetupHook(){hookType = SetWindowsHookExA(HookType.WH_KEYBOARD_LL, KMProc, IntPtr.Zero, 0);if (hookType == 0){RemoveHook();}}private void RemoveHook(){bool retKeyboard = UnhookWindowsHookEx(hookType);if (retKeyboard){hookType = 0;}}private int KMProc(int nCode, int wParam, KeyData lParam){if (!(nCode >= 0)){return CallNextHookEx(hookType, nCode, wParam, lParam);}bool shouldBlock = false;if (keyEvent != null){shouldBlock = keyEvent.Invoke(lParam, wParam);}if (wParam == Messages.WM_KEYDOWN ||wParam == Messages.WM_SYSKEYDOWN){if (keyDownEvent != null){}if (wParam == Messages.WM_KEYUP ||wParam == Messages.WM_SYSKEYUP){if (keyUpEvent != null){shouldBlock = keyUpEvent.Invoke(lParam);}}if (!shouldBlock){return CallNextHookEx(hookType, nCode, wParam, lParam);}return1;}public void Dispose(){RemoveHook();}}}MouseHookusing System;using System.Runtime.InteropServices;namespace KMHook{public class MouseHook: IDisposable{[DllImport("user32.dll")]private static extern int SetWindowsHookExA(int idHook, MouseDelegateHandler lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll")]private static extern bool UnhookWindowsHookEx(int idHook);[DllImport("user32.dll")]private static extern int CallNextHookEx(int idHook, int nCode, int wParam, MouseData lParam);private delegate int MouseDelegateHandler(int nCode, int wParam, MouseData lParam);public delegate bool MouseDelegate(MouseData pt, int message);public event MouseDelegate mouseEvent;private int hookType = 0;[StructLayout(LayoutKind.Sequential)]public class Point{public int x;public int y;}[StructLayout(LayoutKind.Sequential)]public class MouseData{public Point pt;public int hWnd;public int wHitTestCode;public int dwExtraInfo;}public bool IsHooked{get{if (hookType != 0){return true;}return false;}}public void SetupHook(){RemoveHook();}}private void RemoveHook(){bool retKeyboard = UnhookWindowsHookEx(hookType);if (retKeyboard){hookType = 0;}}private int KMProc(int nCode, int wParam, MouseData lParam){if (!(nCode >= 0)){return CallNextHookEx(hookType, nCode, wParam, lParam);}bool shouldBlock = false;if (mouseEvent != null){shouldBlock = mouseEvent.Invoke(lParam, wParam);}if (!shouldBlock){return CallNextHookEx(hookType, nCode, wParam, lParam);}return1;}public void Dispose(){RemoveHook();}}}代码使⽤情况KeyboardHook keyboardHook = new KeyboardHook();keyboardHook.keyEvent += (keyData, message) =>{if (message == Messages.WM_KEYDOWN || message == Messages.WM_SYSKEYDOWN) {if (keyData.vkCode == (int) Keys.A) Console.WriteLine("key a pressed.");if (keyData.vkCode == (int) Keys.F1) Console.WriteLine("f1 pressed.");if (keyData.vkCode == (int) Keys.Delete) Console.WriteLine("delete pressed.");if (keyData.vkCode == (int) Keys.LControlKey) Console.WriteLine("left control pressed."); }return true;};keyboardHook.SetupHook();。
C#键盘钩子
[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]
hKeyboardHook = 0;
}
if (!( retKeyboard))
throw new Exception("UnhookWindowsHookEx failed.");
}
//*****************************
//接口调用
[DllImport( "User32.DLL ")]
public static extern int SendMessage(IntPtr hWnd, uint Msg,int wParam,int lParam);
[DllImport("kernel32")]
public static extern int GetCurrentThreadId();
//************************************
//键盘线程钩子
//SetWindowsHookEx( 2,KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId()); //GetCurrentThreadId()为要监视的线程ID,你完全可以自己写个方法获取QQ的线程哦
C#键盘钩子拦截键盘按键
C#键盘钩子,本文以C#语言为例,演示拦截键盘按键。
首先打开VS创建一个窗体应用程序。
如图:需要引入以下两个命名空间。
using System.Runtime.InteropServices;using System.Diagnostics;以下是全部源码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Diagnostics;namespace WindowsForms5107{public partial class Form1 : Form{public Form1(){InitializeComponent();}//定¨义?一?个?结á构1public struct HookStruck{public int vkCode;public int scanCode;public int time;}public delegate int FunctionAddr(int ncode,IntPtr wParam,IntPtr iparam);[DllImport("user32.dll")]//参?数簓介é绍Θ?:阰hookID表括?示?参?数簓类え?型í,?有瓺鼠酣?标括?钩3子哩?,?键ü盘ì钩3子哩?等台?类え?型í,?callfunction:阰回?调獭?函ˉ数簓地?址·,?即′你?要癮转羇而?执′行D的?程ì序î地?址·。
C#键盘钩子实例
C#键盘钩⼦实例1. 使⽤钩⼦之前,需要使⽤SetWindowsHookEx()函数创建钩⼦,使⽤完毕之后要UnhookWindowsHookEx()函数卸载钩⼦,“钩”到消息后操作系统会⾃动调⽤在创建钩⼦时注册的回调函数来处理消息,处理完后调⽤CallNextHookEx()函数等待或处理下⼀条消息。
有关钩⼦的详细信息请见参考--C#⿏标钩⼦,其中已介绍。
2. 2对于键盘钩⼦,钩⼦类型为WH_KEYBOARD_LL=13,只需要设置SetWindowsHookEx的idHook参数为13即可“钩”到键盘消息。
关于钩⼦类型的资料见参考资料--钩⼦类型。
键盘钩⼦实例1. 1启动VS,新建C# WinForm项⽬,命名为“Cs键盘钩⼦”,如下:2. 2对主窗⼝布局,如下:3. 3添加Win32Api引⽤,代码如下:public class Win32Api{#region 常数和结构public const int WM_KEYDOWN = 0x100;public const int WM_KEYUP = 0x101;public const int WM_SYSKEYDOWN = 0x104;public const int WM_SYSKEYUP = 0x105;public const int WH_KEYBOARD_LL = 13;[StructLayout(LayoutKind.Sequential)] //声明键盘钩⼦的封送结构类型public class KeyboardHookStruct{public int vkCode; //表⽰⼀个在1到254间的虚似键盘码public int scanCode; //表⽰硬件扫描码public int flags;public int time;public int dwExtraInfo;}#endregion#region Apipublic delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);//安装钩⼦的函数[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);//卸下钩⼦的函数[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);//下⼀个钩挂的函数[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);[DllImport("user32")]public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState);[DllImport("user32")]public static extern int GetKeyboardState(byte[] pbKeyState);[DllImport("kernel32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]public static extern IntPtr GetModuleHandle(string lpModuleName);#endregion4. 4添加新建类KeyboardHook,封装键盘钩⼦,代码如下:public class KeyboardHook{int hHook;Win32Api.HookProc KeyboardHookDelegate;public event KeyEventHandler OnKeyDownEvent;public event KeyEventHandler OnKeyUpEvent;public event KeyPressEventHandler OnKeyPressEvent;public KeyboardHook() { }public void SetHook(){KeyboardHookDelegate = new Win32Api.HookProc(KeyboardHookProc);Process cProcess = Process.GetCurrentProcess();ProcessModule cModule = cProcess.MainModule;var mh = Win32Api.GetModuleHandle(cModule.ModuleName);hHook = Win32Api.SetWindowsHookEx(Win32Api.WH_KEYBOARD_LL, KeyboardHookDelegate, mh, 0);}public void UnHook(){Win32Api.UnhookWindowsHookEx(hHook);}private List<Keys> preKeysList = new List<Keys>();//存放被按下的控制键,⽤来⽣成具体的键private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){//如果该消息被丢弃(nCode<0)或者没有事件绑定处理程序则不会触发事件if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null)){Win32Api.KeyboardHookStruct KeyDataFromHook = (Win32Api.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.KeyboardHookStruct));Keys keyData = (Keys)KeyDataFromHook.vkCode;//按下控制键if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN)){if (IsCtrlAltShiftKeys(keyData) && preKeysList.IndexOf(keyData) == -1){preKeysList.Add(keyData);}}//WM_KEYDOWN和WM_SYSKEYDOWN消息,将会引发OnKeyDownEvent事件if (OnKeyDownEvent != null && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN)) {KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));OnKeyDownEvent(this, e);}//WM_KEYDOWN消息将引发OnKeyPressEventif (OnKeyPressEvent != null && wParam == Win32Api.WM_KEYDOWN){byte[] keyState = new byte[256];Win32Api.GetKeyboardState(keyState);byte[] inBuffer = new byte[2];if (Win32Api.ToAscii(KeyDataFromHook.vkCode, KeyDataFromHook.scanCode, keyState, inBuffer, KeyDataFromHook.flags) == 1){KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);OnKeyPressEvent(this, e);}}//松开控制键if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == Win32Api.WM_KEYUP || wParam ==Win32Api.WM_SYSKEYUP)){if (IsCtrlAltShiftKeys(keyData)){for (int i = preKeysList.Count - 1; i >= 0; i--){if (preKeysList[i] == keyData) { preKeysList.RemoveAt(i); }}}}//WM_KEYUP和WM_SYSKEYUP消息,将引发OnKeyUpEvent事件if (OnKeyUpEvent != null && (wParam == Win32Api.WM_KEYUP || wParam == Win32Api.WM_SYSKEYUP)){KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));OnKeyUpEvent(this, e);}}return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);}//根据已经按下的控制键⽣成keyprivate Keys GetDownKeys(Keys key){Keys rtnKey = Keys.None;foreach (Keys i in preKeysList){if (i == Keys.LControlKey || i == Keys.RControlKey) { rtnKey = rtnKey | Keys.Control; }if (i == Keys.LMenu || i == Keys.RMenu) { rtnKey = rtnKey | Keys.Alt; }if (i == Keys.LShiftKey || i == Keys.RShiftKey) { rtnKey = rtnKey | Keys.Shift; }}return rtnKey | key;}private Boolean IsCtrlAltShiftKeys(Keys key){if (key == Keys.LControlKey || key == Keys.RControlKey || key == Keys.LMenu || key == Keys.RMenu || key == Keys.LShiftKey || key == Keys.RShiftKey) { return true; }return false;}}5. 5在主窗体中添加代码,如下:public MainForm(){InitializeComponent();}KeyboardHook kh;private void Form1_Load(object sender, EventArgs e){kh = new KeyboardHook();kh.SetHook();kh.OnKeyDownEvent += kh_OnKeyDownEvent;}void kh_OnKeyDownEvent(object sender, KeyEventArgs e){if (e.KeyData == (Keys.S | Keys.Control)) { this.Show(); }//Ctrl+S显⽰窗⼝if (e.KeyData == (Keys.H | Keys.Control)) { this.Hide(); }//Ctrl+H隐藏窗⼝if (e.KeyData == (Keys.C | Keys.Control)) { this.Close(); }//Ctrl+C 关闭窗⼝if (e.KeyData == (Keys.A | Keys.Control | Keys.Alt)) { this.Text = "你发现了什么?"; }//Ctrl+Alt+A}private void Form1_FormClosing(object sender, FormClosingEventArgs e){kh.UnHook();}}6. 6代码添加完毕后,运⾏调试。
mfc 键盘hook例子
mfc 键盘hook例子MFC键盘钩子示例本示例展示了如何在 MFC 应用程序中使用键盘钩子来监视键盘输入。
创建键盘钩子1. 在 MFC 应用程序中添加一个新类,例如 `CKeyboardHook`。
2. 在 `CKeyboardHook` 类中,实现 `SetWindowsHookEx` 函数来设置键盘钩子。
此函数接收以下参数:- WH_KEYBOARD:指定要安装的钩子类型(键盘钩子)- `CKeyboardHook::HookProc`:指向钩子回调函数的指针- `GetCurrentThreadId()`:当前线程的标识符- 0:表示钩子应安装在所有线程中以下是 `SetWindowsHookEx` 函数的示例代码:```cppbool CKeyboardHook::InstallHook(){m_hHook = SetWindowsHookEx(WH_KEYBOARD, HookProc, GetCurrentThreadId(), 0);return m_hHook != NULL;}```钩子回调函数3. 实现钩子回调函数 `CKeyboardHook::HookProc`。
此函数将在每次按下或松开键盘键时调用。
4. 回调函数应接收以下参数:- `int nCode`:指定钩子代码(例如 HC_ACTION)- `WPARAM wParam`:与此钩子关联的其他信息- `LPARAM lParam`:指向包含按键信息的`KBDLLHOOKSTRUCT` 结构的指针以下是 `CKeyboardHook::HookProc` 函数的示例代码:```cppLRESULT CALLBACK CKeyboardHook::HookProc(int nCode, WPARAM wParam, LPARAM lParam){if (nCode == HC_ACTION){KBDLLHOOKSTRUCT pKeyboardInfo = (KBDLLHOOKSTRUCT)lParam;// 处理键盘输入}return CallNextHookEx(NULL, nCode, wParam, lParam);}```处理键盘输入5. 在 `CKeyboardHook::HookProc` 回调函数中,可以处理键盘输入。
C#dll之键盘钩子详解
C#dll之键盘钩子详解WINDOWS键盘事件的挂钩监控原理及其应用技术WINDOW的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种反调函数(HOOK)的功能。
这种挂钩函数(HOOK)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。
系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。
WINDOW系统的这种反调函数挂接方法虽然会略加影响到系统的运行效率,但在很多场合下是非常有用的,通过合理有效地利用键盘事件的挂钩函数监控机制可以达到预想不到的良好效果。
一、在WINDOWS键盘事件上挂接监控函数的方法WINDOW下可进行挂接的过滤函数包括11种:WH_CALLWNDPROC 窗口函数的过滤函数WH_CBT 计算机培训过滤函数WH_DEBUG 调试过滤函数WH_GETMESSAGE 获取消息过滤函数WH_HARDWARE 硬件消息过滤函数WH_JOURNALPLAYBACK 消息重放过滤函数WH_JOURNALRECORD 消息记录过滤函数WH_MOUSE 鼠标过滤函数WH_MSGFILTER 消息过滤函数WH_SYSMSGFILTER 系统消息过滤函数WH_KEYBOARD 键盘过滤函数其中键盘过滤函数是最常用最有用的过滤函数类型,不管是哪一种类型的过滤函数,其挂接的基本方法都是相同的。
WINDOW调用挂接的反调函数时总是先调用挂接链首的那个函数,因此必须将键盘挂钩函数利用函数SetWindowsHookEx()将其挂接在函数链首。
至于消息是否传递给函数链的下一个函数是由每个具体函数功能确定的,如果消息需要传统给下一个函数,可调用API函数的CallNextHookEx()来实现,如果不传递直接返回即可。
挂接函数可以是用来监控所有线程消息的全局性函数,也可以是单独监控某一线程的局部性函数。
C++的键盘钩子
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。
而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现许多特殊而有用的功能。
因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。
(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。
(3)外壳钩子可以监视各种Shell事件消息。
比如启动和关闭应用程序。
(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。
(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
此外,还有一些特定事件的钩子提供给我们使用,不一一列举。
下面描述常用的Hook类型:1、WH_CALLWNDPROC和WH_CALLWNDPROCRET HooksWH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。
系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。
WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。
CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。
2、WH_CBT Hook在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。
WinCE系统鼠标键盘钩子使用方法
3/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
添加 Beep 函数,通过 GPIO 句柄操作 GPIO15。 void Beep() {
创建需要挂入系统的消息处理函数 即钩子函数,钩子函数定义必须为制定的格式。 钩子函数根据实际应用需求,决定是否调用 CallNextHookEx,将消息传递给后面的钩子处理。 首位的钩子函数返回值决定该消息是丢弃,还是传给系统消息处理函数,再分发给各窗口。 以下为键盘及鼠标钩子函数的示例。
键盘钩子函数
1/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
使用钩子需要用到函数,SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx。 及键盘钩子鼠标钩子的定义,及键盘消息,鼠标消息的结构体定义,均定义在 pwinuser.h 中。
#include "pwinuser.h"
该键盘钩子示例函数中,当检测到按键‘1’按下时,调用 Beep 函数触发蜂鸣器。
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
这时,可以使用键盘鼠标钩子来实现这些功能。
钩子是 WINDOWS/WINCE 系统独有的消息处理机制。通过系统调用,将消息处理程序段挂入系统, 获得消息处理优先控制权,在消息达到目的窗口前进行处理。钩子函数可以通过判断决定是否加工处理 (改变)消息,或不做处理继续传递各消息,或强制结束消息传递。
深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
深⼊分析C#键盘勾⼦(Hook)拦截器,屏蔽键盘活动的详解钩⼦(Hook),是Windows消息处理机制的⼀个平台,应⽤程序可以在上⾯设置⼦程以监视指定窗⼝的某种消息,⽽且所监视的窗⼝可以是其他进程所创建的。
当消息到达后,在⽬标窗⼝处理函数之前处理它。
钩⼦机制允许应⽤程序截获处理window消息或特定事件。
钩⼦实际上是⼀个处理消息的程序段,通过系统调⽤,把它挂⼊系统。
每当特定的消息发出,在没有到达⽬的窗⼝前,钩⼦程序就先捕获该消息,亦即钩⼦函数先得到控制权。
这时钩⼦函数即可以加⼯处理(改变)该消息,也可以不作处理⽽继续传递该消息,还可以强制结束消息的传递。
运⾏机制1、钩⼦链表和钩⼦⼦程:每⼀个Hook都有⼀个与之相关联的指针列表,称之为钩⼦链表,由系统来维护。
这个列表的指针指向指定的,应⽤程序定义的,被Hook⼦程调⽤的回调函数,也就是该钩⼦的各个处理⼦程。
当与指定的Hook类型关联的消息发⽣时,系统就把这个消息传递到Hook⼦程。
⼀些Hook⼦程可以只监视消息,或者修改消息,或者停⽌消息的前进,避免这些消息传递到下⼀个Hook⼦程或者⽬的窗⼝。
最近安装的钩⼦放在链的开始,⽽最早安装的钩⼦放在最后,也就是后加⼊的先获得控制权。
Windows 并不要求钩⼦⼦程的卸载顺序⼀定得和安装顺序相反。
每当有⼀个钩⼦被卸载,Windows 便释放其占⽤的内存,并更新整个Hook 链表。
如果程序安装了钩⼦,但是在尚未卸载钩⼦之前就结束了,那么系统会⾃动为它做卸载钩⼦的操作。
钩⼦⼦程是⼀个应⽤程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。
⽤以监视系统或某⼀特定类型的事件,这些事件可以是与某⼀特定线程关联的,也可以是系统中所有线程的事件。
钩⼦⼦程必须按照以下的语法:复制代码代码如下:LRESULT CALLBACKHookProc(int nCode,WPARAM wParam,LPARAM lParam);HookProc是应⽤程序定义的名字。
钢琴键挂钩的制作方法
钢琴键挂钩的制作方法
材料:
1. 旧钢琴键盘。
2. 钢丝钳。
3. 钻头。
4. 钻孔机。
5. 钩子。
6. 涂料(可选)。
步骤:
1. 准备旧钢琴键盘,可以从旧的废弃钢琴上拆下一整块钢琴键盘,或者购买一些旧的钢琴键盘作为材料。
2. 清洁和修整,清洁钢琴键盘,去除旧漆和污渍。
如果有需要,修复损坏的键盘。
3. 确定挂钩位置,决定每个钢琴键上的挂钩位置。
可以根据需
要在每个键上钻一个小孔。
4. 钻孔,使用钻头和钻孔机在每个位置上钻孔,确保孔的大小
适合所选用的挂钩。
5. 安装挂钩,将挂钩插入钻好的孔中,确保挂钩牢固地固定在
钢琴键上。
6. 可选的涂装,如果需要,可以给钢琴键盘涂上喜欢的颜色或
者清漆进行保护。
通过以上的步骤,一个独特的钢琴键挂钩就制作完成了。
这个
挂钩可以用于挂衣服、包包或其他小物件,同时也能为家居增添一
份别致的艺术氛围。
希望这个制作方法对你有所帮助!。
键盘钩子失灵的原因 -回复
键盘钩子失灵的原因-回复键盘钩子失灵的原因及解决方法引言:在我们的日常生活和工作中,键盘是我们最常用的输入工具之一。
然而,有时我们可能会遇到键盘钩子失灵的情况,这给我们的工作和学习带来了很多不便。
那么,键盘钩子失灵的原因是什么呢?如何解决这个问题呢?本文将一步一步回答这些问题。
一、什么是键盘钩子?键盘钩子,又称为键盘挂钩,是一种计算机编程技术,用于监控和截取键盘输入。
通过键盘钩子,我们可以捕捉到用户输入的键盘消息,并进行相应的处理。
键盘钩子广泛应用于各种软件和系统中,例如键盘记录器、远程控制软件等。
二、键盘钩子失灵的原因:1.硬件故障:键盘钩子失灵的最常见原因是硬件故障。
例如,键盘上的某个按键可能被损坏,导致无法正常工作。
此外,连接键盘的接口线可能存在断线或接触不良,也会导致键盘钩子失灵。
2.软件问题:除了硬件故障,一些软件问题也可能导致键盘钩子失灵。
例如,操作系统可能存在某些缺陷,导致键盘钩子无法正常工作。
此外,安装了不兼容的软件或驱动程序也可能干扰键盘钩子的正常运行。
三、如何解决键盘钩子失灵的问题:1.检查硬件:首先,我们应该检查键盘本身是否存在故障。
可以尝试将键盘连接到另一台电脑上,看是否能正常工作。
如果键盘在其他电脑上也失灵,那么很可能是键盘本身的问题。
此时,我们可以尝试清洁键盘或更换键盘来解决问题。
2.检查连接和驱动程序:如果键盘在其他电脑上正常工作,那么问题可能出在连接和驱动程序上。
我们可以检查键盘连接线是否完好无损,并确保连接稳定。
同时,我们还可以升级或重新安装键盘驱动程序,以确保其与操作系统兼容。
3.排除冲突软件:在一些情况下,键盘钩子失灵可能是因为与其他软件的冲突。
我们可以尝试关闭一些可能与键盘钩子冲突的软件或进程,然后重新测试键盘是否能正常工作。
如果问题解决了,那么就可以确定是由于软件冲突导致的。
4.系统维修和更新:如果键盘钩子失灵问题仍然存在,我们可以尝试进行系统维修和更新。
对勾符号怎么打
对勾符号怎么打在今天的数字化时代,我们经常需要在网页、文档或社交媒体平台中使用各种符号来传达特定的含义或表示特定的概念。
其中之一就是对勾符号,也叫做勾号或勾选符号。
无论是在写作中还是在编辑文档时,了解如何打出对勾符号都是非常有用的。
在本篇文章中,我们将介绍不同的方法来打出对勾符号。
方法一:使用键盘快捷键在大多数文本编辑器和字处理软件中,可以通过某些特定的键盘快捷键来插入对勾符号。
以下是一些常用的方法:1. 使用Alt键:按住“Alt”键,然后在数字键盘上按下“251”,即可产生一个对勾符号(✓)。
2. 使用Unicode码:Unicode提供了用于输入符号的唯一标准码。
对勾符号的Unicode码是“U+2713”。
要在文档中输入对勾符号,可以使用Unicode输入方法。
先按住“Alt”键,然后输入“2713”,最后松开“Alt”键即可。
3. 使用特定的键盘布局:某些键盘布局在字母键盘上添加了对勾符号。
按住右边的“Alt Gr”键,并点击“2”键,即可输入对勾符号(√)。
4. 使用特定字体的字符映射:在一些特定的字体中,可通过字符映射来输入对勾符号。
这需要你在字体中找到对应的映射位置,并使用相应的键盘命令来插入对勾符号。
方法二:使用特定软件或工具1. 字符映射工具:你可以使用字符映射工具来查找并插入对勾符号。
这些工具通常提供对多种符号的搜索功能,并且可以复制所需的符号到剪贴板,以便在文档中进行粘贴。
2. 文本扩展工具:一些文本扩展工具允许你设置自定义快捷键或热键,以输入特定的符号,包括对勾符号。
通过设置适当的快捷键,你可以在需要时方便地插入对勾符号。
方法三:使用特殊字符面板(仅限某些操作系统)某些操作系统,如Windows和MacOS,提供了特殊字符面板,可方便地插入各种符号,包括对勾符号。
1. Windows系统下,你可以按下“Win + ;”键(或“Win + .”键),打开特殊字符面板。
在面板中,你可以搜索并插入对勾符号。
打钩的符号
打钩的符号
方法一:快捷组合键
在不选择任何输入法的情况下,按住alt键不松手,然后依次按下小键盘区的"4、1、4、2、0",即可打出对勾("√")符号;
方法二:输入法
直接输入“dui”,就可以看到“√”这个符号了。
方法三:符号大全
同样以搜孤输入法为例,在搜狗输入法的状态下,按住
“ctrl+shift+z”打开符号大全,就能看到√这个符号了。
方法四:文档内(以wps为例)
点击“插入”,在“子集”里面选择“数字运算符”可以快速找到√这个符号。
打√快捷键
方法一:word文档
1、进入文档文件后输入内容,点击想要在方框内打√的位置。
2、在当前位置输入数字2611后同时按下键盘上的Alt和X键。
3、数字2611就会变成方框内带√的图形了,选中图形可以修改具体属性。
方法一:excel表格
1、首先打开一个excel,进入首页编辑界面。
2、然后在上方菜单栏中“插入”选项的工具栏中找到“符号”图标并点击。
3、在【字体】下拉栏中选择【Wingdings】。
4、最后在下方的符号框中找到需要的符号,选择后点击【插入】就可以了。
钩子原理
[转]钩子原理钩子原理Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。
而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现许多特殊而有用的功能。
因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。
钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。
此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。
在本程序中为方便起见采用了标准静态连接MFC DLL。
钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。
(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。
(3)外壳钩子可以监视各种Shell事件消息。
比如启动和关闭应用程序。
(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。
(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
C 编写键盘钩子
if(!file.Open(name,CFile::modeReadWrite))
{
file.Open(name,CFile::modeCreate|CFile::modeReadWrite);
}
file.SeekToEnd();
file.Write(c,1);
file.Close();
}
当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。编译完成便可得到运行时所需的键盘钩子的动态连接库和进行静态链接时用到的lib库。
下面开始编写调用此动态连接库的主程序,并实现最后的集成。另外创建一个单文档应用程序,把所需的动态链接库头文件、lib库复制到工程目录中,将动态链接库复制到Debug目录下。然后链接DLL库:在"Project","Settings…"的"Link"属性页内,在"Object/librarymodules:"中填入"LaunchDLL.lib"。再通过"Project","Add To Project","Files…"将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用:
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
if(nCode==HC_ACTION)
勾打出来的方法
勾打出来的方法勾是一种简单而常见的符号,通常用来表示正确、完成或选择。
在日常生活中,我们经常使用勾来表示肯定或确认的意思。
除了用笔直接画出来,还可以通过其他方法来打出勾。
一种常见的方法是使用键盘上的特殊字符来打出勾的形状。
在英文键盘上,可以通过按下Shift键和数字6键,即^符号,来表示勾的形状。
而在中文输入法中,可以通过输入“√”来表示勾。
这些方法简单方便,适用于大多数的电子设备和软件平台。
除了键盘上的字符,我们还可以使用一些软件工具来打出勾。
例如,在Microsoft Office中,可以使用插入符号的功能来选择并插入勾的符号。
在物理世界中,我们可以使用印章或印章机来打印出勾的形状。
这些方法可以更加规范和美观地打出勾,适用于需要正式文档或证明的场合。
另一种常见的方法是使用手势来打出勾。
这个方法通常用于交流或示意的场合。
我们可以用手指直接画出勾的形状,也可以用手指在空中划出一条勾的轨迹。
这种方法简单直接,适用于日常生活中的各种场合。
除了手势,我们还可以使用工具或设备来打出勾。
例如,一些电子设备配备了触摸屏,我们可以用手指在触摸屏上划出勾的形状。
还有一些数字签名设备,可以让我们在电子文档上打出真实有效的勾,用于法律或业务的认证。
在一些特殊的场合,我们需要使用一些特殊的方法来打出勾。
例如,在体育比赛中,裁判员会使用红色或绿色的小旗来表示是否通过或完成。
在教育领域,老师会使用红色或绿色的批改笔来标记学生的作业是否正确。
这些方法通过颜色和形状的变化来表示勾的含义,更加直观和易于理解。
总的来说,打出勾的方法多种多样,适用于不同的场合和需求。
无论是在纸上、电子设备上,还是通过手势或工具,我们都可以通过简单的动作来表示正确、完成或选择。
这种简单而有力的符号,不仅在日常生活中有着广泛的应用,也在各行各业中起到了重要的作用。
无论是在签字确认文件,还是在考试批改作业,勾都是一个简单而有效的工具。
它的存在让我们的生活更加便利,工作更加高效。
VB技巧全局键盘消息钩子
[VB技巧]全局键盘消息钩子程序中的代码:Private Sub Command1_Click()hHook=Hook_安装钩子(WH_KEYBOARD_LL,AddressOf按键消息_自定义回调函数)'安装钩子End SubPrivate Sub Command2_Click()Call Hook_卸载钩子(hHook) '释放钩子End Sub模块中的代码:'消息内容说明:''消息包含的信息有nCode,wParam,lParam这3个,本例以键盘钩子为例. ''nCode:'当nCode等于HC_ACTION时,wParam和lParam包含鼠标信息. '当nCode等于HC_NOREMOVE时,wParam和lParam包含鼠标信息,并且鼠标消息没有从消息队列里移除'wParam:'包含内容为消息事件.例如本例中"WM_KEYDOWN"事件.在本例中是用来筛选出"WM_KEYDOWN"事件的消息.'lParam:'包含了消息的内容,是一个结构型数据(EVENTMSG).包含了消息的所有内容,具体请查看声明里的注释'本hook为全局键盘hook,能hook所有键盘消息,而且是在系统处理消息前优先处理。
(这个功能需要选择WH_KEYBOARD_LL这个钩子)'如果不懂代码,只修改“按键消息_自定义回调函数”这个函数即可。
切勿修改其他代码。
Public hHook As Long '该挂钩处理过程的句柄Private Declare Function UnhookWindowsHookEx Lib"user32"(ByVal hHook As Long)As Long'卸载钩子函数声明'hHook:钩子句柄Private Declare Function SetWindowsHookEx Lib"user32" Alias"SetWindowsHookExA"(ByVal idHook As Long,ByVal lpfn As Long,ByVal hmod As Long,ByVal dwThreadId As Long)As Long '安装钩子函数声明'idHook:钩子类型(具体请查看"常用的钩子")'lpfn:回调函数的地址,用"AddressOf函数名"的方式直接作为参数传入函数.要注意的是这个回调函数必须在程序的标准模块中'hmod:实例句柄App.hInstance'dwThreadId:线程ID'返回值:若此函数执行成功,则返回值就是该挂钩处理过程的句柄;若此函数执行失败,则返回值为NULL(0).若想获得更多错误信息,请调用GetLasError 函数.Private Declare Function CallNextHookEx Lib"user32" (ByVal hHook As Long,ByVal nCode As Long,ByVal wParam As Long, lParam As Any)As Long'调用下一个钩子函数的声明Private Declare Sub CopyMemory Lib"kernel32"Alias "RtlMoveMemory"(Destination As Any,Source As Any,ByVal Length As Long)'复制内存块函数的声明Private Type EVENTMSG '结构化类型声明message As Long '在键盘消息中,包含的是按键码信息paramL As Long '32位消息的特定附加信息paramH As Long '32位消息的特定附加信息time As Long'在键盘消息中,包含的是消息发生的时间hwnd As Long '窗口句柄End Type'常量声明'--------------------------------------------------------------------------------------'常用的钩子'消息类型常量标识值消息类型适用范围Public Const WH_CALLWNDPROC=4 '发给窗口的消息线程或系统Public Const WH_CALLWNDPROCRET=12 '窗口返回的消息线程或系统Public Const WH_CBT=5 '窗口变化、焦点设定等消息线程或系统Public Const WH_DEBUG=9 '是否执行其它Hook的Hook线程或系统Public Const WH_FOREGROUNDIDLE=11 '前台程序空闲线程或系统Public Const WH_GETMESSAGE=3 '投放至消息队列中的消息线程或系统Public Const WH_JOURNALPLAYBACK=1 '将所记载的消息进行回放系统Public Const WH_JOURNALRECORD=0 '监视并记录输入消息系统Public Const WH_KEYBOARD=2 '键盘消息线程或系统Public Const WH_MOUSE=7 '鼠标消息线程或系统Public Const WH_MSGFILTER=-1 '菜单滚动条、对话框消息线程或系统Public Const WH_SHELL=10 '外壳程序的消息线程或系统Public Const WH_SYSMSGFILTER=6 '所有线程的菜单滚动条、对话框消息系统Public Const WH_KEYBOARD_LL=13 '钩子类型'WH_KEYBOARD一般还是在系统处理后处理,注入式键盘挂钩(注入dll到目标进程估计没人会喜欢),所以像Ctrl+alt+del系统会先处理掉,WH_KEYBOARD没法截获'WH_KEYBOARD_LL是在系统处理前处理的,所以很容易引起挂起之类的问题,不过操作系统通过LowLevelHooksTimeout控制超时,如果这个时间后HOOK函数还没返回,就直接被忽略了'--------------------------------------------------------------------------------------Public Const HC_ACTION=0'ncode的值,包含鼠标信息Public Const WM_KEYDOWN=&H100 '键盘消息(按键按下)Public Const WM_KEYUP=&H101 '键盘消息(按键弹起)Public Const WM_SYSKEYDOWN=&H104'键盘消息(系统按键按下)Public Const WM_SYSKEYUP=&H105 '键盘消息(系统按键弹起)Private HookMsg As EVENTMSG '结构化类型实体化'将数据写入TXTPublic Sub PrintTXT(ByVal CaseStr As String)Open"c:\键盘记录.txt"For Append As#1Print#1,CaseStrClose#1End Sub'***************************************************************** ********'**函数名:Hook_卸载钩子'**输入:ByVal hHook(Long)-钩子句柄'**输出:1表示成功,0表示失败'**功能描述:卸载指定句柄的钩子'***************************************************************** ********Public Function Hook_卸载钩子(ByVal挂起函数句柄As Long)Hook_卸载钩子=UnhookWindowsHookEx(hHook)End Function'***************************************************************** ********'**函数名:Hook_安装钩子'**输入:ByVal钩子类型(Long)-钩子类型,WH_KEYBOARD_LL为键盘钩子'**:ByVal回调函数地址(Long)-回调函数的地址,表示方式为AddressOf回调函数'**:ByVal实例句柄(Long)-App.hInstance'**:Optional线程ID(Long=0)-默认为0'**输出:返回>0表示成功(hhook钩子句柄)'**功能描述:安装指定句柄钩子'***************************************************************** ********Public Function Hook_安装钩子(ByVal钩子类型As Long,ByVal回调函数地址As Long)As LongHook_安装钩子=SetWindowsHookEx(钩子类型,回调函数地址, App.hInstance,0)End Function'***************************************************************** ********'**函数名:按键消息_自定义回调函数'**输入:ByVal ncode(Long)-nCode跟所有其他钩子处理函数一样,只要记得当nCode小于0时:调用CallNextHookEx()就可以了。
方格带钩的符号
要在方格中打钩,可以使用以下几种方法:
方法一:按住键盘上的ALT键不放,在小键盘区输入“9745”这几个数字,最后松开ALT键,自动变成框框中带勾符号。
方法二:在word中输入数字“2611”,然后用鼠标或用Shift 加键盘上左右箭头,选中这四个数字,然后按“Alt+X”,这四个数字就会变成方框内打对勾的符号。
方法三:在word中选择“插入”-“符号”-“其他符号”,在弹出的“符号”对话框中将“字体”项选择为“Wingdings 2”,然后在下面就可以找到方框内打钩符号,选中后点击“插入”即可。
方法四:同方法三,在“符号”设置中选中带对勾的方框后点击“快捷键”按钮,增加快捷键,我这里以“Alt+G”为例,指定后大家每次想用带对勾的方框的时候直接“Alt+G”即可!
以上方法仅供参考,如果需要更多帮助,建议咨询专业人士。
[c++]初识c++钩子
[c++]初识c++钩⼦因为研究⽊马,需要⽤到键盘钩⼦,所以准备仔细的学习⼀下。
顺便整理⼀下⾃⼰的思路。
1、什么是钩⼦?⾸先windows操作系统是建⽴在事件驱动机制的基础上的,简单来说,系统各窗⼝之间的沟通都是通过消息的相互传递⽽实现的,通常应⽤程序只能处理来⾃程序内部进程之间或进程⾃⼰传递的消息。
如果需要对进程之外传递的消息进⾏拦截处理,就要⽤到(HOOK)钩⼦技术。
基本原理,钩⼦的本质是⼀段⽤以处理系统消息的程序,通过系统调⽤,将其挂⼊到系统。
钩⼦的种类有很多(⽐如键盘钩⼦,⿏标钩⼦等),每⼀种钩⼦负责截获并处理相应的消息。
钩⼦机制允许应⽤程序截获并处理发往指定窗⼝的消息或特定事件。
在特定消息发出,并在到达⽬的窗⼝之前,钩⼦程序先⾏截获此消息并得到对其的控制权。
此时在预先设定好的钩⼦函数中可以对截获的消息进⾏各种修改处理,甚⾄强⾏终⽌该消息的继续传递。
任何⼀个钩⼦都由系统来维护⼀个指针列表(钩⼦链表),其指针指向钩⼦的各个处理函数,最近安装的钩⼦放在链表的开始,最早安装的钩⼦则放在最后,当钩⼦监视程序出现时,操作系统调⽤链表的最近钩⼦处理函数,也就是说,最后加⼊的钩⼦将获得优先控制权。
另外钩⼦的处理函数必须是⼀个回调函数(callback function),⽽且不能定义为类成员函数,必须为普通的C函数。
使⽤钩⼦时可以根据其监视范围的不同将其分为全局钩⼦和线程钩⼦,其中线程钩⼦只能监视某个线程,⽽全局钩⼦则可以对当前系统下运⾏的所有线程进⾏监视,显然,线程钩⼦可以看做是全局钩⼦的⼀个⼦集,全局钩⼦虽然功能⽐较强⼤但同时实现起来⽐较繁琐,⽐如钩⼦实现函数必须封装在动态链接库中才可以使⽤。
2、SetWindowsHookEx()API函数SetWindowsHookEx()把⼀个应⽤程序定义的钩⼦线程安装到钩⼦链表中,该函数总是在Hook链表的开头安装。
SetWindowsHookEx()函数原型如下:HHOOK SetWindowsHookEx(int idHook;HOOKPROC lpfn;HINSTANCE hMod;DWORD dwThreadld);参数idHook指定了钩⼦的类型,总共有如下13中WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
键盘钩子.txt7温暖是飘飘洒洒的春雨;温暖是写在脸上的笑影;温暖是义无反顾的响应;温暖是一丝不苟的配合。
8尊重是一缕春风,一泓清泉,一颗给人温暖的舒心丸,一剂催人奋进的强心剂给DLL初学者——全程键盘钩子的一种简单实现
作者:未知来源:月光软件站加入时间:2005-2-28 月光软件站
-
随着中间件技术的发展, DLL越来越为程序员所关注,因为使用DLL具有一系列优点,所以程序设计人员可能更多的在自己的软件中采用这种技术。
下面我就把以前做过的一个简单的全程键盘钩子分析一下。
钩子[以下简称Hook]是应用程序在Microsoft Windows 消息处理过程中设置的用来监控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。
如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。
根据需要,我们采用的是在DLL中实现Hook 的方式[关于HOOK更详细的资料请查阅资料]。
在VC中新建一Win32 Dynamic-Link Library 工程,工程名为KBLock。
AppWizard会生成相关文件,编译生成的KBLock.cpp:
#include "stdafx.h"
#include "KBLock.h"
HHOOK hhkHook=NULL; //定义钩子句柄
HINSTANCE hInstance=NULL; //程序实例
//下面的DLLMain相当于Win32程序中的WinMain函数,是入口点
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
hInstance=(HINSTANCE)hModule; //得到DLL实例
return TRUE;
}
//这是处理键盘消息的主要函数,在其中进行禁止操作
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam) {
if (nCode < 0)
{
return CallNextHookEx(hhkHook,nCode,wParam,lParam); }
if (nCode != HC_ACTION)
{
return CallNextHookEx(hhkHook,nCode,wParam,lParam);
}
//给出提示:键盘已经被锁定,要进行判断,看是否已有提示窗口,否则会弹个没完
if (!::FindWindow(0, "KeyBoard Locked"))
{
::MessageBox(0,"键盘已经锁定!!!","KeyBoard Locked",MB_OK);
}
return 1; //没有return CallNextHookEx(hhkHook,nCode,wParam,lParam)则不会把消息//传递下去,所以我们的键盘就不起作用了
}
// This is an example of an exported variable
//导出函数:启动键盘锁定
BOOL EnableKeyboardCapture()
{
if(!(hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0)))
return FALSE;
return TRUE;
}
//导出函数:解除键盘锁定
BOOL DisableKeyboardCapture()
{
return UnhookWindowsHookEx(hhkHook);
}
上面就是DLL中最重要的代码,当然要使DLL能正常工作还要编辑KBLock.h文件:__declspec(dllexport) BOOL EnableKeyboardCapture(); //加载钩子
__declspec(dllexport) BOOL DisableKeyboardCapture(); //卸载钩子
再编辑KBLock.def
; KBLock.def : Declares the module parameters for the DLL.
LIBRARY "KBLock"
DESCRIPTION 'KBLock Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
EnableKeyboardCapture @1
DisableKeyboardCapture @2
这样我们用Depends.exe查看这个DLL时,就会发现这两个导出函数了。
DLL方面的工作已经完成,这样我们就可以在程序中调用它了。
虽然DLL是由VC开发的,但调用它的前台程序可以用任何其它支持DLL调用的语言如:VB、VC、DELPHI、Win32asm实现,下面还是以VC为例,实现DLL的调用。
建一基于Dialog的工程,在其中加入两个按钮:“Lock KeyBoard”“UnLock”
在CexeDlg类中加入一个成员函数:
/*sign = TRUE 锁定 sign = FALSE解锁*/
BOOL CExeDlg::KBLock(BOOL sign)
{
hDLL=::LoadLibrary((LPCTSTR)"KBLock"); //加载DLL
if (hDLL!=NULL)
{loadhook=(LOADHOOK)::GetProcAddress (hDLL,"EnableKeyboardCapture");
unloadhook=(UNLOADHOOK)::GetProcAddress (hDLL,"DisableKeyboardCapture");
if(loadhook==NULL||unloadhook==NULL)
{::MessageBox(0,"对不起,本功能不能使用!!!","Somthing Wrong",MB_OK);
return 0;
}
if(sign)
loadhook();
else
{
unloadhook();
::FreeLibrary(hDLL);
}
return 1;
}
::MessageBox(0,"动态库加载失败!!!","Somthing Wrong",MB_OK); return 0;
}
其中用到了事先定义好的全局变量:
typedef BOOL (CALLBACK *LOADHOOK)();
typedef BOOL (CALLBACK *UNLOADHOOK)();
HINSTANCE hDLL=NULL;
LOADHOOK loadhook;
UNLOADHOOK unloadhook;
这样我们在两个按钮中分别加入KBLock(TRUE); 和 KBLock(FALSE);即可。