hook捕捉鼠标的键盘的操作
- 格式:docx
- 大小:15.45 KB
- 文档页数:2
jnativehook 是一个 Java 库,它提供全局的键盘和鼠标事件侦听功能。
以下是使用 jnativehook 的基本步骤:1. 下载和安装 jnativehook:首先,你需要从 jnativehook 的官方网站下载相关的库文件,并将其添加到你的 Java 项目的类路径中。
2. 创建一个监听器:在 Java 项目中创建一个监听器类,该类将实现 jnativehook 的接口来处理各种事件。
你可以创建一个名为 MyKeyListener 的类,并让它实现 NativeKeyListener 接口。
以下是一个简单的示例:java复制代码import org.jnativehook.GlobalScreen;import org.jnativehook.NativeHookException;import org.jnativehook.keyboard.NativeKeyEvent;import org.jnativehook.keyboard.NativeKeyListener;public class MyKeyListener implements NativeKeyListener {public void nativeKeyPressed(NativeKeyEvent e) {System.out.println("Key Pressed: " +NativeKeyEvent.getKeyText(e.getKeyCode()));}public void nativeKeyReleased(NativeKeyEvent e) {System.out.println("Key Released: " +NativeKeyEvent.getKeyText(e.getKeyCode()));}public void nativeKeyTyped(NativeKeyEvent e) {System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));}public static void main(String[] args) {try {GlobalScreen.registerNativeHook();} catch (NativeHookException ex) {System.err.println("There was a problem registering the native hook.");System.err.println(ex.getMessage());System.exit(1);}GlobalScreen.addNativeKeyListener(new MyKeyListener());}}在这个示例中,我们创建了一个名为 MyKeyListener 的类,并实现了 NativeKeyListener 接口。
Java实现Hook对鼠标键盘监听-沐早SNOTEBOOK-CSDN博客Java 实现 Hook 对鼠标键盘监听收藏Java 实现全局(全操作系统)的鼠标和键盘监控,使用的是SWT Win32 Extension 项目,在以前若使用Java恐怕是很难实现的!SWT Win32 Extension 让Java拥有了许多对操作系统底层操作的功能!注:本程序需要SWT Win32 Extension支持?以下两个例子是:(一)鼠标Hookview plaincopy to clipboardprint?1.import org.sf.feeling.swt.win32.extension.hook.Hook;2.import org.sf.feeling.swt.win32.extension.hook.data.Hook Data;3.import org.sf.feeling.swt.win32.extension.hook.data.Mous eHookData;4.import org.sf.feeling.swt.win32.extension.hook.listener.Ho okEventListener;5.6.public class HotMouse {7.8.public static void main(String[] args) {9.Hook.MOUSE.addListener(new HookEventListener() {10.public void acceptHookData(HookData hookData) {11.if (hookData != null) {12.//System.out.println("Mouse Point X = " + ((MouseHo okData)hookData).getPointX());13.//System.err.println("Mouse Point Y =" + ((MouseHookData)hookData).getPointY());14.System.err.println(((MouseHookData)hookData).getPoi ntX()+"," + ((MouseHookData)hookData).getPointY());15.}16.if (hookData.getWParam() == 513) { System.out.p rintln("left button pressed");// left button pressed17.} else if (hookData.getWParam() == 514) { System.out .println("left button released");// left button released18.} else if (hookData.getWParam() == 516) { System.out .println("right button pressed");// right button pressed19.} else if (hookData.getWParam() == 517) { System.out .println("right button");// right button20.} else if (hookData.getWParam() == 519) { System.out .println("middle button 519");// middle button21.} else if (hookData.getWParam() == 520) { System.out .println("middle button 520");// middle button22.}23.}24.});25.Hook.MOUSE.install();26.}27.28.}(二)键盘Hookview plaincopy to clipboardprint?1.import org.sf.feeling.swt.win32.extension.hook.Hook;2.import org.sf.feeling.swt.win32.extension.hook.data.HookData;3.import org.sf.feeling.swt.win32.extension.hook.data.Keyb oardHookData;4.import org.sf.feeling.swt.win32.extension.hook.listener.Ho okEventListener;5.6.public class HotKey {7.public static void main(final String[] args) {8.Hook.KEYBOARD.addListener(new HookEventListener(){// @Override9.public void acceptHookData(HookData arg0) {10.KeyboardHookData KHD = ((KeyboardHookData)arg0) ;11.System.out.println(KHD.getWParam()+" - "+KHD.getTr ansitionState()); //Print code12.if( KHD.getScanCode() == 29 && KHD.getTransitionSt ate()){ //按下Ctrl執行動作13.System.out.println("Hotting");14.}else if( KHD.getScanCode() == 1 ){ //按下[ESC]結束15.System.exit(0);16.}17.}});18.Hook.KEYBOARD.install(); //註冊事件19.}20.}以上两个例子源于:这里要感谢!感谢!。
pyhook的简单使⽤实验内容:通过python编程调⽤windows的api,编写键盘和⿏标监控的hook,将相关信息保存记录到txt⽂档中。
实验步骤:1.Hook技术,pyHook3和pywin32简介1.1 Hook简介windows应⽤程序是基于消息驱动的。
各种应⽤程序对各种消息作出响应从⽽实现各种功能。
hook(钩⼦)是⼀种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往⽬标窗⼝的消息并进⾏处理。
所以说,我们可以在系统中⾃定义钩⼦,⽤来监视系统中特定事件的发⽣,完成特定功能,如屏幕取词,监视⽇志,截获键盘、⿏标输⼊等等。
钩⼦实际上是⼀个处理消息的,通过,把它挂⼊系统。
每当特定的消息发出,在没有到达⽬的窗⼝前,就先捕获该消息,亦即先得到控制权。
这时钩⼦函数即可以加⼯处理(改变)该消息,也可以不作处理⽽继续传递该消息,还可以强制结束消息的传递。
Windows消息带了⼀些程序有⽤的信息,⽐如Mouse类信息,就带有⿏标所在窗体句柄、⿏标位置等信息,拦截了这些消息,就可以利⽤这些信息做出⼀些功能每⼀个Hook都有⼀个与之相关联的列表,称之为钩⼦,由系统来维护。
这个列表的指针指向指定的,应⽤程序定义的,被Hook⼦程调⽤的,也就是该钩⼦的各个处理⼦程序。
当与指定的Hook类型关联的消息发⽣时,系统就把这个消息传递到Hook⼦程。
⼀些Hook⼦程可以只监视消息,或者修改消息,或者停⽌消息的前进,避免这些消息传递到下⼀个Hook⼦程或者⽬的窗⼝。
最近安装的钩⼦放在链的开始,⽽最早安装的钩⼦放在最后,也就是后加⼊的先获得控制权。
与线程钩⼦:SetWindowsHookEx()函数的最后⼀个参数决定了此钩⼦是系统钩⼦还是线程钩⼦。
线程钩⼦⽤于监视指定线程的事件消息。
线程钩⼦⼀般在当前线程或者当前线程派⽣的线程内。
系统钩⼦监视系统中的所有线程的事件消息。
因为系统钩⼦会影响系统中所有的应⽤程序,所以必须放在独⽴的动态链接库(DLL) 中。
DELPHIHOOK函数建立键盘鼠标动作记录与回放在Delphi中,可以通过使用Hook函数来建立键盘鼠标动作的记录与回放。
Hook函数可以拦截系统消息和事件,并允许我们在消息处理前或处理后执行自定义的代码。
首先,我们需要创建一个DLL来实现Hook函数。
在Delphi中,可以通过创建一个动态链接库项目来实现这一点。
在动态链接库项目中,我们将添加一个Hook函数来拦截键盘和鼠标事件。
在Hook函数中,我们可以使用Windows API来获取键盘和鼠标的状态,以及记录和回放这些动作。
以下是一个简单的示例代码,演示如何创建基本的键盘鼠标动作记录与回放的功能:```delphilibrary MouseKeyboardHook;usesSystem.SysUtils,System.Classes,Winapi.Windows;varFOutputFile: TextFile;function KeyboardHookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;varkbHookStruct: PKBDLLHOOKSTRUCT;vkCode: Cardinal;beginif code >= 0 thenbeginkbHookStruct := PKBDLLHOOKSTRUCT(lParam);vkCode := kbHookStruct^.vkCode;//将键盘记录写入文件WriteLn(FOutputFile, 'Keyboard: ' + IntToStr(vkCode));end;// 继续传递消息给下一个HookResult := CallNextHookEx(0, code, wParam, lParam);end;function MouseHookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;varmsHookStruct: PMOUSEHOOKSTRUCT;mouseMsg: Cardinal;pt: TPoint;beginif code >= 0 thenbeginmsHookStruct := PMOUSEHOOKSTRUCT(lParam);mouseMsg := msHookStruct^.mouseData;pt := msHookStruct^.pt;//将鼠标记录写入文件WriteLn(FOutputFile, 'Mouse: ' + IntToStr(mouseMsg) + ' X:' + IntToStr(pt.X) + ' Y:' + IntToStr(pt.Y));end;// 继续传递消息给下一个HookResult := CallNextHookEx(0, code, wParam, lParam);end;procedure StartRecording;beginAssignFile(FOutputFile, 'actions.log');Rewrite(FOutputFile);// 安装键盘Hook// 安装鼠标Hookend;procedure StopRecording;begin// 卸载键盘Hook// 卸载鼠标HookCloseFile(FOutputFile);end;exportsStartRecording,StopRecording;beginend.```在上述代码中,我们创建了两个Hook函数:KeyboardHookProc和MouseHookProc。
利用钩子函数来捕捉键盘响应的windows应用程序一:引言:你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到了windows的钩子函数。
因此本文将对钩子函数的相关知识进行阐述。
当然,本文的目的并不是想通过此程序让读者去窃取别人的密码,只是由于钩子函数在windows系统中是一个非常重要的系统接口函数,所以想和大家共同的探讨,当然本文也对怎样建立动态连结库(DLL)作了一些简单的描述。
(本文的程序为vc6.0的开发环境,语言是:C和win32 api)。
二:钩子概述:微软的windowsX操作系统是建立在事件驱动的机制上的,也就是通过消息传递来实现。
而钩子在windows操作系统中,是一种能在事件(比如:消息、鼠标激活、键盘响应)到达应用程序前中途接获事件的机制。
而且,钩子函数还可以通过修改、丢弃等手段来对事件起作用。
Windows 有两种钩子,一种是特定线程钩子(Thread specific hooks),一种是全局系统钩子(Systemwide hooks)。
特定线程钩子只是监视指定的线程,而全局系统钩子则可以监视系统中所有的线程。
无论是特定线程钩子,还是全局系统钩子,都是通过SetWindowsHookEx ()来设置钩子的。
对于特定线程钩子,钩子的函数既可以是包含在一个.exe也可以是一个.dll。
但是对于一个全局系统钩子,钩子函数必须包含在独立的dll中,因此,当我们要捕捉键盘响应时,我们必须创建一个动态链接库。
但是当钩子函数在得到了控制权,并对相关的事件处理完后,如果想要该消息得以继续的传递,那么则必须调用另一个函数:CallNextHookEx。
由于系统必须对每个消息处理,钩子程序因此增加了处理的负担,因此也降低了系统的性能。
鉴于这一点,在windows ce中对钩子程序并不支持。
DELPHIHOOK函数建立键盘鼠标动作记录与回放1.键盘记录与回放:DELPHIHOOK函数可以捕获用户在键盘上的按键操作,并将这些操作记录下来,然后可以进行回放,模拟用户的按键过程。
这个功能在程序调试和测试中非常有用,可以帮助开发人员快速定位问题所在。
2.鼠标动作记录与回放:除了键盘操作,DELPHIHOOK函数还可以记录用户在鼠标上的操作,比如点击、移动等动作。
这样,在程序调试和测试中,可以直观地看到用户是如何操作鼠标的,从而更好地理解用户行为和需求。
3.自定义快捷键设定:DELPHIHOOK函数还支持自定义快捷键的设定,用户可以根据自己的需求设置一些快捷键,方便程序操作和调试。
DELPHIHOOK函数的实现原理是通过Windows的Hook技术来实现的,Hook是一种在Windows系统中用于拦截和修改系统消息和事件的机制。
DELPHIHOOK函数通过加载一个DLL动态链接库,并在其中设置一些Hook函数,来拦截并记录用户的键盘和鼠标操作。
下面我们来看一下DELPHIHOOK函数的具体实现步骤:1. 创建一个DLL项目:首先,在Delphi中创建一个DLL项目,命名为HookDLL。
2. 实现键盘Hook函数:在HookDLL中实现一个键盘Hook函数,用于捕获用户在键盘上的按键操作。
可以使用Windows API中的SetWindowsHookEx函数来实现。
3. 实现鼠标Hook函数:同样,在HookDLL中实现一个鼠标Hook函数,用于捕获用户在鼠标上的操作。
可以使用Windows API中的SetWindowsHookEx函数来实现。
4. 记录用户操作:在HookDLL中实现一个记录用户操作的函数,将捕获到的键盘和鼠标操作记录下来,保存到一个文件或内存中。
5. 回放用户操作:在HookDLL中实现一个回放用户操作的函数,用来读取之前记录的操作,然后模拟用户的操作过程。
6. 在主程序中调用HookDLL:最后,在Delphi主程序中调用HookDLL中的函数,来实现键盘和鼠标动作的记录和回放功能。
DELPHIHOOK函数建立键盘鼠标动作记录与回放Delphi是一种非常强大的编程语言和集成开发环境。
使用Delphi,我们可以开发各种类型的应用程序,包括桌面应用程序、移动应用程序和网页应用程序等。
本文将介绍如何使用Delphi编写钩子函数来记录和回放键盘和鼠标动作。
钩子函数是一种特殊的函数,可以捕获和处理操作系统中发生的事件。
在Delphi中,可以使用Windows API函数来设置钩子函数。
下面是一些常用的钩子函数:1. SetWindowsHookEx函数:用于设置全局钩子函数。
可以使用该函数来捕获系统中发生的各种事件,包括键盘事件和鼠标事件等。
2. CallNextHookEx函数:用于将事件传递给下一个钩子函数或默认处理程序。
在钩子函数中,应该调用该函数来确保事件被正确处理。
3. UnhookWindowsHookEx函数:用于删除之前设置的钩子函数。
首先,我们需要创建一个新的Delphi工程并添加一个窗体。
在窗体上放置两个按钮,一个用于开始记录,另一个用于停止记录。
我们还需要添加一些全局变量来保存记录的动作。
```delphiunit Main;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;IsRecording: Boolean;Actions: TList;implementation{$R *.dfm}procedure RecordMouseAction(var Msg: TMessage); stdcall; beginif IsRecording thenbegin//记录鼠标动作case Msg.Msg ofWM_LBUTTONDOWN:Actions.Add(Pointer('MouseLeftButtonDown'));WM_LBUTTONUP:Actions.Add(Pointer('MouseLeftButtonUp'));WM_RBUTTONDOWN:Actions.Add(Pointer('MouseRightButtonDown'));WM_RBUTTONUP:Actions.Add(Pointer('MouseRightButtonUp'));//添加更多的鼠标动作记录end;end;CallNextHookEx(0, Msg.Msg, Msg.WParam, Msg.LParam);end;procedure RecordKeyboardAction(var Msg: TMessage); stdcall; beginif IsRecording thenbegin//记录键盘动作case Msg.Msg ofWM_KEYDOWN:Actions.Add(Pointer('KeyDown:' + IntToStr(Msg.WParam))); WM_KEYUP:Actions.Add(Pointer('KeyUp:' + IntToStr(Msg.WParam)));//添加更多的键盘动作记录end;end;CallNextHookEx(0, Msg.Msg, Msg.WParam, Msg.LParam);end;procedure TForm1.Button1Click(Sender: TObject);begin//开始记录Actions := TList.Create;//设置鼠标钩子//设置键盘钩子IsRecording := True;end;procedure TForm1.Button2Click(Sender: TObject); vari: Integer;begin//停止记录IsRecording := False;//卸载钩子UnhookWindowsHookEx(HookMouse); UnhookWindowsHookEx(HookKeyboard);//回放记录的动作for i := 0 to Actions.Count - 1 dobeginif StrPos(PChar(Actions[i]), 'Mouse') <> nil then beginif StrPos(PChar(Actions[i]), 'ButtonDown') <> nil then begin//执行鼠标按下动作endelse if StrPos(PChar(Actions[i]), 'ButtonUp') <> nil then begin//执行鼠标松开动作end;endelse if StrPos(PChar(Actions[i]), 'Key') <> nil then beginif StrPos(PChar(Actions[i]), 'Down') <> nil thenbegin//执行键盘按下动作endelse if StrPos(PChar(Actions[i]), 'Up') <> nil thenbegin//执行键盘松开动作end;end;end;Actions.Free;end;end.```在上面的代码中,我们使用记录和回放动作的两个按钮的单击事件来控制开始/停止记录和回放动作。
外挂技术(钩子)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. 同步系统消息队列事件。
VB HOOK(钩子)超级无敌详细用法(介绍)hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。
下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。
关于HOOKS使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。
建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。
HOOK链WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。
例如,WH_MOUSE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。
HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。
如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。
(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)HOOK过程为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK 链中安装你自己的HOOK函数。
该函数语法如下:public function MyHook(nCode,wParam,iParam) as long‘加入代码end function其中MyHook可以随便命名,其它不能变。
该函数必须放在模块段。
nCode指定HOOK类型。
wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。
SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。
你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。
【转】C#.Net鼠标和键盘全局监控勾子(hook)【转】C#.Net 鼠标和键盘全局监控勾子(hook )//C#鼠标和键盘全局监控hookusing System;using System.Runtime.InteropServices;using System.Reflection;using System.Threading;using System.Windows.Forms;using ponentModel;namespace ScreenCapyure2{public class UserActivityHook{#region Windows structure definitions[StructLayout(LayoutKind.Sequential)]private class POINT{public int x;public int y;}[StructLayout(LayoutKind.Sequential)]private class MouseHookStruct{public POINT pt;public int hwnd;public int wHitTestCode;public int dwExtraInfo;}[StructLayout(LayoutKind.Sequential)]private class MouseLLHookStruct{public POINT pt;public int mouseData;public int flags;public int time;public int dwExtraInfo;}[StructLayout(LayoutKind.Sequential)]private class KeyboardHookStruct{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}#endregion#region Windows function imports[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)]private static extern int SetWindowsHookEx(int idHook,HookProc lpfn,IntPtr hMod,int dwThreadId);[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)]private static extern int UnhookWindowsHookEx(int idHook);[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]private static extern int CallNextHookEx(int idHook,int nCode,int wParam,IntPtr lParam);private delegate int HookProc(int nCode, int wParam, IntPtr lParam);[DllImport("user32")]private static extern int ToAscii(int uVirtKey,int uScanCode,byte[] lpbKeyState,byte[] lpwTransKey,int fuState);[DllImport("user32")]private static extern int GetKeyboardState(byte[] pbKeyState);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern short GetKeyState(int vKey);#endregion#region Windows constantsprivate const int WH_MOUSE_LL = 14;private const int WH_KEYBOARD_LL = 13;private const int WH_MOUSE = 7;private const int WH_KEYBOARD = 2;private const int WM_MOUSEMOVE = 0x200;private const int WM_LBUTTONDOWN = 0x201;private const int WM_RBUTTONDOWN = 0x204;private const int WM_MBUTTONDOWN = 0x207;private const int WM_LBUTTONUP = 0x202;private const int WM_RBUTTONUP = 0x205;private const int WM_MBUTTONUP = 0x208;private const int WM_LBUTTONDBLCLK = 0x203;private const int WM_RBUTTONDBLCLK = 0x206;private const int WM_MBUTTONDBLCLK = 0x209;private const int WM_MOUSEWHEEL = 0x020A;private const int WM_KEYDOWN = 0x100;private const int WM_KEYUP = 0x101;private const int WM_SYSKEYDOWN = 0x104;private const int WM_SYSKEYUP = 0x105;private const byte VK_SHIFT = 0x10;private const byte VK_CAPITAL = 0x14;private const byte VK_NUMLOCK = 0x90;#endregionpublic UserActivityHook(){Start();}public UserActivityHook(bool InstallMouseHook, bool InstallKeyboardHook){Start(InstallMouseHook, InstallKeyboardHook);}~UserActivityHook(){Stop(true, true, false);}public event MouseEventHandler OnMouseActivity;public event KeyEventHandler KeyDown;public event KeyPressEventHandler KeyPress;public event KeyEventHandler KeyUp;private int hMouseHook = 0;private int hKeyboardHook = 0;private static HookProc MouseHookProcedure;private static HookProc KeyboardHookProcedure;public void Start(){this.Start(true, true);}public void Start(bool InstallMouseHook, bool InstallKeyboardHook){if (hMouseHook == 0 && InstallMouseHook){MouseHookProcedure = new HookProc(MouseHookProc);hMouseHook = SetWindowsHookEx(WH_MOUSE_LL,MouseHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);if (hMouseHook == 0){int errorCode = Marshal.GetLastWin32Error();Stop(true, false, false);try{ throw new Win32Exception(errorCode); }catch{ }}}if (hKeyboardHook == 0 && InstallKeyboardHook){KeyboardHookProcedure = new HookProc(KeyboardHookProc);hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);if (hKeyboardHook == 0){int errorCode = Marshal.GetLastWin32Error();Stop(false, true, false);try{throw new Win32Exception(errorCode);}catch { }}}}public void Stop(){this.Stop(true, true, true);}public void Stop(bool UninstallMouseHook, bool UninstallKeyboardHook, bool ThrowExceptions){if (hMouseHook != 0 && UninstallMouseHook){int retMouse = UnhookWindowsHookEx(hMouseHook);hMouseHook = 0;if (retMouse == 0 && ThrowExceptions){int errorCode = Marshal.GetLastWin32Error();throw new Win32Exception(errorCode);}}if (hKeyboardHook != 0 && UninstallKeyboardHook){int retKeyboard = UnhookWindowsHookEx(hKeyboardHook);hKeyboardHook = 0;if (retKeyboard == 0 && ThrowExceptions){int errorCode = Marshal.GetLastWin32Error();throw new Win32Exception(errorCode);}}}private int MouseHookProc(int nCode, int wParam, IntPtr lParam){if ((nCode >= 0) && (OnMouseActivity != null)){MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam,typeof(MouseLLHookStruct));MouseButtons button = MouseButtons.None;short mouseDelta = 0;switch (wParam){case WM_LBUTTONDOWN:button = MouseButtons.Left;break;case WM_RBUTTONDOWN:button = MouseButtons.Right;break;case WM_MOUSEWHEEL:mouseDelta = (short)((mouseHookStruct.mouseData >> 16) & 0xffff);break;}int clickCount = 0;if (button != MouseButtons.None)if (wParam == WM_LBUTTONDBLCLK || wParam == WM_RBUTTONDBLCLK) clickCount = 2;else clickCount = 1;MouseEventArgs e = new MouseEventArgs(button,clickCount,mouseHookStruct.pt.x,mouseHookStruct.pt.y,mouseDelta);OnMouseActivity(this, e);}return CallNextHookEx(hMouseHook, nCode, wParam, lParam);}private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){bool handled = false;if ((nCode >= 0) && (KeyDown != null || KeyUp != null || KeyPress != null)){KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam,typeof(KeyboardHookStruct));if (KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)){Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;KeyEventArgs e = new KeyEventArgs(keyData);KeyDown(this, e);handled = handled || e.Handled;}if (KeyPress != null && wParam == WM_KEYDOWN){bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false);bool isDownCapslock = (GetKeyState(VK_CAPITAL) != 0 ? true : false);byte[] keyState = new byte[256];GetKeyboardState(keyState);byte[] inBuffer = new byte[2];if (ToAscii(MyKeyboardHookStruct.vkCode,MyKeyboardHookStruct.scanCode,keyState,inBuffer,MyKeyboardHookStruct.flags) == 1){char key = (char)inBuffer[0];if ((isDownCapslock ^ isDownShift) && Char.IsLetter(key)) key = Char.T oUpper(key);KeyPressEventArgs e = new KeyPressEventArgs(key);KeyPress(this, e);handled = handled || e.Handled;}}if (KeyUp != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP)){Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;KeyEventArgs e = new KeyEventArgs(keyData);KeyUp(this, e);handled = handled || e.Handled;}}if (handled)return 1;elsereturn CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);}}}//////////////////////可以把以上程序单独存为一个文件如:SC.CS;然后在项目里“添加现有项”找到该文件记住引用using ScreenCapyure2;//以下为在窗体中监视事件//本程序调试不起作用,运行时才起作用UserActivityHook choosesc;choosesc = new UserActivityHook();choosesc.OnMouseActivity += new MouseEventHandler(choose_OnMouseActivity);choosesc.KeyDown += new KeyEventHandler(MyKeyDown);choosesc.KeyPress += new KeyPressEventHandler(MyKeyPress);choosesc.KeyUp += new KeyEventHandler(MyKeyUp);//上面部分写到 InitializeComponent()后面public void MyKeyDown(object sender, KeyEventArgs e){}public void MyKeyPress(object sender, KeyPressEventArgs e) {}public void MyKeyUp(object sender, KeyEventArgs e){}private void choose_OnMouseActivity(object sender, MouseEventArgs e){if (e.Clicks > 0){if ((MouseButtons)(e.Button) == MouseButtons.Left){point[0] = e.Location;}if ((MouseButtons)(e.Button) == MouseButtons.Right){point[1] = e.Location;}}//throw new Exception("The method or operation is not implemented.");}。
基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。
当消息到达后,在目标窗口处理函数之前处理它。
钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。
每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
例如:在系统中安装自定义的钩子,监视系统中特定时间的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现效果特殊而有用的功能。
由此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
理论WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。
利用它们,您可以捕捉您自己进程或其它进程发生的事件。
通过“钩挂”,您可以给WINDOWS 一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。
一共有两种类型的钩子:局部的和远程的。
工作原理当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。
新的钩子将加到老的前面。
当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。
如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。
当然有两个例外:工作日志钩子和工作日志回放钩子。
这两个钩子的钩子函数必须在安装钩子的线程中。
原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。
DELPHIHOOK函数建立键盘鼠标动作记录与回放在实现键盘和鼠标动作记录与回放功能时,我们需要使用一些Delphi的API函数和事件,如SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx等。
首先,我们需要定义一个Hook处理函数,用于处理键盘和鼠标事件。
这个函数会接收到用户输入的键盘和鼠标消息,并将其存储到日志文件中。
以下是一个简单的示例:```Delphifunction HookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;varKeyState: TKeyState;MouseEvent: TMouseEvent;KeyboardEvent: TKeyboardEvent;Buffer: String;FHandle: THandle;beginResult := CallNextHookEx(HookHandle, Code, wParam, lParam);if Code < 0 thenExit;case wParam ofWM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_RBUTTONDOWN,WM_RBUTTONUP,WM_MBUTTONDOWN,WM_MBUTTONUP,WM_MOUSEWHEEL:beginMouseEvent.Message := wParam;MouseEvent.X := TSmallPoint(Pointer(lParam)^).X;MouseEvent.Y := TSmallPoint(Pointer(lParam)^).Y;MouseEvent.Time := GetTickCount;// 将MouseEvent存储到日志文件中Buffer := Format('Mouse Message: %s X: %d Y: %d Time: %d', [GetMessageName(MouseEvent.Message), MouseEvent.X, MouseEvent.Y, MouseEvent.Time]);WriteLog(Buffer);WM_KEYDOWN,WM_KEYUP:beginKeyState.Message := wParam;KeyState.VKey := TKeyboardState(Pointer(lParam)^).VKey;KeyState.Time := GetTickCount;// 将KeyState存储到日志文件中Buffer := Format('Keyboard Message: %s VKey: %d Time: %d', [GetMessageName(KeyState.Message), KeyState.VKey,KeyState.Time]);WriteLog(Buffer);end;end;end;procedure StartHook;beginend;procedure StopHook;UnhookWindowsHookEx(HookHandle);end;procedure WriteLog(const Log: String);beginFHandle := CreateFile('log.txt', GENERIC_READ orGENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);SetFilePointer(FHandle, 0, nil, FILE_END);WriteFile(FHandle, PChar(Log)^, Length(Log), nil, nil);CloseHandle(FHandle);end;```在上面的示例中,HookProc函数是主要的处理函数。
hook的使用摘要:1.引言2.Hook 的定义和作用3.Hook 的使用方法4.Hook 的实际应用5.Hook 的优缺点6.结论正文:【引言】在计算机编程中,Hook 是一种可以实现在程序运行过程中,对接收到的消息或事件进行过滤或处理的技术。
这种技术被广泛应用于各种软件开发中,如Windows 操作系统、Linux 系统以及各种手机应用等。
本文将详细介绍Hook 的使用方法、实际应用和优缺点。
【Hook 的定义和作用】Hook 是一种编程接口,可以允许程序在运行时插入额外的代码,以实现对某些消息或事件的过滤或处理。
通过使用Hook,程序员可以在不必修改原有代码的基础上,实现对程序的新功能或优化。
【Hook 的使用方法】要使用Hook,一般需要以下步骤:1.首先,需要确定要拦截的消息或事件类型,如鼠标点击、键盘输入等。
2.其次,需要编写拦截处理函数,该函数在接收到指定类型的消息或事件时被调用。
3.最后,需要将编写的拦截处理函数与Hook 关联起来,以便在程序运行时调用。
【Hook 的实际应用】Hook 技术在实际应用中具有广泛的用途,如:1.Windows 操作系统中的Hook,可以用于实现病毒或木马的监控和控制。
2.在手机应用中,Hook 可以用于实现对特定应用或功能的优化或增强。
3.在游戏开发中,Hook 可以用于实现游戏外挂,以实现对游戏进程的监控和控制。
【Hook 的优缺点】Hook 技术具有以下优缺点:优点:1.可以在不修改原有代码的基础上,实现新功能或优化。
2.可以实现对程序的实时监控和处理,提高程序的灵活性和可扩展性。
缺点:1.可能会导致程序稳定性下降,如出现死锁、崩溃等问题。
2.被恶意使用时,可能导致安全风险,如病毒、木马等。
【结论】Hook 技术作为一种在程序运行时插入额外代码的方法,具有广泛的应用前景。
然而,在使用过程中需要注意其可能带来的稳定性和安全风险。