C++ hook如何只屏蔽某个程序的键盘输入,而不是所有程序.

C++ hook如何只屏蔽某个程序的键盘输入,而不是所有程序.,第1张

// 你是用线程钩子函数就行

// 第一个尝试是处理的消息类型

//第二个是回调函数

//第三个为NULL就行

//第四个参数是处理那个线程的消息 (这里是本线程)

HHOOK g_keyhook=NULL;

g_keyhook=SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL,GetCurrentThreadId());

//////////////////////////////////////////////////////

//键盘钩子(回调函数)

LRESULT CALLBACK KeyboardProc(

int code, // hook code

WPARAM wParam, // virtual-key code

LPARAM lParam // keystroke-message information

)

{

//如何处理键盘消息

//如果钩子处理的消息,您可以返回一个非0值,防止系统把消息传递给钩子链中的下一个钩

//子, //或者把消息发送到目标窗口。

return CallNextHookEx(g_keyhook, code, wParam, lParam);

};

这个有点难,而且做出来也需要时间,我没有时间做,给你一点资料吧:

捕捉所有进程关闭的消息,用SetWindowsHookEx挂钩到全局钩子,SetWindowsHookEx函数的资料

SetWindowsHookEx(

idHook: Integer; {钩子类型}

lpfn: TFNHookProc; {函数指针}

hmod: HINST; {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}

dwThreadId: DWORD {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子}

): HHOOK; {返回钩子的句柄; 0 表示失败}

//钩子类型 idHook 选项:

WH_MSGFILTER = -1; {线程级; 截获用户与控件交互的消息}

WH_JOURNALRECORD = 0; {系统级; 记录所有消息队列从消息队列送出的输入消息, 在消息从队列中清除时发生; 可用于宏记录}

WH_JOURNALPLAYBACK = 1; {系统级; 回放由 WH_JOURNALRECORD 记录的消息, 也就是将这些消息重新送入消息队列}

WH_KEYBOARD = 2; {系统级或线程级; 截获键盘消息}

WH_GETMESSAGE = 3; {系统级或线程级; 截获从消息队列送出的消息}

WH_CALLWNDPROC = 4; {系统级或线程级; 截获发送到目标窗口的消息, 在 SendMessage 调用时发生}

WH_CBT = 5; {系统级或线程级; 截获系统基本消息, 譬如: 窗口的创建、激活、关闭、最大最小化、移动等等}

WH_SYSMSGFILTER = 6; {系统级; 截获系统范围内用户与控件交互的消息}

WH_MOUSE = 7; {系统级或线程级; 截获鼠标消息}

WH_HARDWARE = 8; {系统级或线程级; 截获非标准硬件(非鼠标、键盘)的消息}

WH_DEBUG = 9; {系统级或线程级; 在其他钩子调用前调用, 用于调试钩子}

WH_SHELL = 10; {系统级或线程级; 截获发向外壳应用程序的消息}

WH_FOREGROUNDIDLE = 11; {系统级或线程级; 在程序前台线程空闲时调用}

WH_CALLWNDPROCRET = 12; {系统级或线程级; 截获目标窗口处理完毕的消息, 在 SendMessage 调用后发生}

这里有一个示例程序:

>

hook技术很难勾住控制台程序,当然,如果有办法把握时机向控制台程序INJECT动态库,也是可以hook住控制台程序的。一般而言,使用了user32dll的程序(GUI程序)是比较容易hook的。

根据《windows核心编程》中所说的,可以尝试使用CAPIHooker和CreateRemoteThread来对控制台程序进行远程注入,这样便有机会挂住控制台程序。这可能是一种方法。当然也可能有其它的方法。

总而言之,使用控制台程序不容易hook。

就是钩子,用于劫持消息,在windows中是这样的,因为win32程序是以消息机制为基础的,比如你点击鼠标,会给窗口传递一个消息,移动鼠标,会给窗口一个消息,用钩子可以比你的窗口先检测到这个消息,从而得到这个消息进行处理,你的窗口可能就处理不到这个消息了,要看你的钩子处理程序是否把这个消息传给窗口,具体看WIN32应用程序开发吧,

WIN将所有HOOK组成一个list

最后HOOK的在list头

系统是从list头还是调用回调,如果回调中有调用CallNextHook,下面的HOOK才能收到

如果你能保证你在最后钩上,就能防止其他HOOK程序~

以上就是关于C++ hook如何只屏蔽某个程序的键盘输入,而不是所有程序.全部的内容,包括:C++ hook如何只屏蔽某个程序的键盘输入,而不是所有程序.、C++ Hook编程、一个控制台程序,只想试试hook的过程:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9271821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存