c# 程序钩子的问题
百度在很多的网上都说什么加入这个钩子那个钩子,定义什么钩子的进去,可是我直接将百度中的钩子复制带代码中去,却没用,很显示这些代码都是无用的,错误的,我想问的是钩子到底在c...
百度在很多的网上都说什么加入这个钩子那个钩子,定义什么钩子的进去,可是我直接将百度中的钩子复制带代码中去,却没用,很显示这些代码都是无用的,错误的,我想问的是钩子到底在c#里面是什么含义,怎么使用钩子,而且怎么百度的那些钩子前面都有 [DllImport("USER32.DLL")] 这种类型的字符串
还有钩子是写在哪的? 展开
还有钩子是写在哪的? 展开
2个回答
展开全部
C#是面向对象的编程语言,所以钩子是写在类中的。
/// <summary>
/// 设置的钩子类型
/// </summary>
public enum HookType : int
{
/// <summary>
/// WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以把守菜单,迁移转变
///条,消息框,对话框消息并且发明用户应用ALT+TAB or ALT+ESC 组合键切换窗口。
///WH_MSGFILTER Hook只能把守传递到菜单,迁移转变条,消息框的消息,以及传递到通
///过安装了Hook子过程的应用法度建树的对话框的消息。WH_SYSMSGFILTER Hook
///把守所有应用法度消息。
///WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以在模式轮回时代
///过滤消息,这等价于在主消息轮回中过滤消息。
///经由过程调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。经由过程应用这
///个函数,应用法度可以或许在模式轮回时代应用雷同的代码去过滤消息,如同在主消息循
///环里一样
/// </summary>
WH_MSGFILTER = -1,
/// <summary>
/// WH_JOURNALRECORD Hook用来把守和记录输入事务。典范的,可以应用这
///个Hook记录连气儿的鼠标和键盘事务,然后经由过程应用WH_JOURNALPLAYBACK Hook
///往返放。WH_JOURNALRECORD Hook是全局Hook,它不克不及象线程特定Hook一样
///应用。WH_JOURNALRECORD是system-wide local hooks,它们不会被打针到任何行
///程地址空间
/// </summary>
WH_JOURNALRECORD = 0,
/// <summary>
/// WH_JOURNALPLAYBACK Hook使应用法度可以插入消息到体系消息队列。可
///以应用这个Hook回放经由过程应用WH_JOURNALRECORD Hook记录下来的连气儿的鼠
///标和键盘事务。只要WH_JOURNALPLAYBACK Hook已经安装,正常的鼠标和键盘
///事务就是无效的。WH_JOURNALPLAYBACK Hook是全局Hook,它不克不及象线程特定
///Hook一样应用。WH_JOURNALPLAYBACK Hook返回超时价,这个值告诉体系在处
///理来自回放Hook当前消息之前须要守候多长时候(毫秒)。这就使Hook可以把握实
///时事务的回放。WH_JOURNALPLAYBACK是system-wide local hooks,它们不会被
///打针到任何行程地址空间
/// </summary>
WH_JOURNALPLAYBACK = 1,
/// <summary>
/// 在应用法度中,WH_KEYBOARD Hook用来把守WM_KEYDOWN and
///WM_KEYUP消息,这些消息经由过程GetMessage or PeekMessage function返回。可以使
///用这个Hook来把守输入到消息队列中的键盘消息
/// </summary>
WH_KEYBOARD = 2,
/// <summary>
/// 应用法度应用WH_GETMESSAGE Hook来把守从GetMessage or PeekMessage函
///数返回的消息。你可以应用WH_GETMESSAGE Hook去把守鼠标和键盘输入,以及
///其它发送到消息队列中的消息
/// </summary>
WH_GETMESSAGE = 3,
/// <summary>
/// 把守发送到窗口过程的消息,体系在消息发送到接管窗口过程之前调用
/// </summary>
WH_CALLWNDPROC = 4,
/// <summary>
/// 在以下事务之前,体系都邑调用WH_CBT Hook子过程,这些事务包含:
///1. 激活,建树,烧毁,最小化,最大化,移动,改变尺寸等窗口事务;
///2. 完成体系指令;
///3. 来自体系消息队列中的移动鼠标,键盘事务;
///4. 设置输入核苦衷务;
///5. 同步体系消息队列事务。
///Hook子过程的返回值断定体系是否容许或者防止这些操纵中的一个
/// </summary>
WH_CBT = 5,
/// <summary>
/// WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以把守菜单,迁移转变
///条,消息框,对话框消息并且发明用户应用ALT+TAB or ALT+ESC 组合键切换窗口。
///WH_MSGFILTER Hook只能把守传递到菜单,迁移转变条,消息框的消息,以及传递到通
///过安装了Hook子过程的应用法度建树的对话框的消息。WH_SYSMSGFILTER Hook
///把守所有应用法度消息。
///WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以在模式轮回时代
///过滤消息,这等价于在主消息轮回中过滤消息。
///经由过程调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。经由过程应用这
///个函数,应用法度可以或许在模式轮回时代应用雷同的代码去过滤消息,如同在主消息循
///环里一样
/// </summary>
WH_SYSMSGFILTER = 6,
/// <summary>
/// WH_MOUSE Hook把守从GetMessage 或者 PeekMessage 函数返回的鼠标消息。
///应用这个Hook把守输入到消息队列中的鼠标消息
/// </summary>
WH_MOUSE = 7,
/// <summary>
/// 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时
/// </summary>
WH_HARDWARE = 8,
/// <summary>
/// 在体系调用体系中与其它Hook接洽关系的Hook子过程之前,体系会调用
///WH_DEBUG Hook子过程。你可以应用这个Hook来决意是否容许体系调用与其它
///Hook接洽关系的Hook子过程
/// </summary>
WH_DEBUG = 9,
/// <summary>
/// 外壳应用法度可以应用WH_SHELL Hook去接管首要的通知。当外壳应用法度是
///激活的并且当顶层窗口建树或者烧毁时,体系调用WH_SHELL Hook子过程。
///WH_SHELL 共有5钟景象:
///1. 只要有个top-level、unowned 窗口被产生、起感化、或是被摧毁;
///2. 当Taskbar须要重画某个按钮;
///3. 当体系须要显示关于Taskbar的一个法度的最小化情势;
///4. 当今朝的键盘布局状况改变;
///5. 当应用者按Ctrl+Esc去履行Task Manager(或雷同级此外法度)。
///遵守常规,外壳应用法度都不接管WH_SHELL消息。所以,在应用法度可以或许接
///收WH_SHELL消息之前,应用法度必须调用SystemParametersInfo function注册它自
///己
/// </summary>
WH_SHELL = 10,
/// <summary>
/// 当应用法度的前台线程处于余暇状况时,可以应用WH_FOREGROUNDIDLE
///Hook履行低优先级的任务。当应用法度的前台线程可能要变成余暇状况时,体系就
///会调用WH_FOREGROUNDIDLE Hook子过程
/// </summary>
WH_FOREGROUNDIDLE = 11,
/// <summary>
/// 把守发送到窗口过程的消息,体系在消息发送到接管窗口过程之后调用
/// </summary>
WH_CALLWNDPROCRET = 12,
/// <summary>
/// 把守输入到线程消息队列中的键盘消息
/// </summary>
WH_KEYBOARD_LL = 13,
/// <summary>
/// 把守输入到线程消息队列中的鼠标消息
/// </summary>
WH_MOUSE_LL = 14
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("USER32.DLL")]
private static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);//导入钩子函数消息传递的方法
[DllImport("USER32.DLL")]
private static extern IntPtr SetWindowsHookEx(HookType idHook, HookProc lpfn, IntPtr hMod, int dwThreadId);//导入设置钩子的方法
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);
//导入卸载钩子的方法
private delegate int HookProc(int nCode, int wParam, IntPtr lParam); //声明回调函数
///<summary>
///自定义回调函数
///</summary>
private int HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
MessageBox.Show(nCode.ToString());
//键盘按下时
if (nCode >= 0 && wParam == (IntPtr)0)
{
int vkCode = Marshal.ReadInt32(lParam);
Keys key = (Keys)vkCode;
MessageBox.Show(key.ToString());
}
return CallNextHookEx(handle, nCode, wParam, lParam);
}
private void Form1_Load(object sender, EventArgs e)
{
//创建钩子(这个函数的参数你可以百度找找,C#钩子研究过但没成功)
SetWindowsHookEx(params);
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询