键盘钩子怎么 使用

作者&投稿:祗斩 (若有异议请与网页底部的电邮联系)
中了键盘鼠标钩子程序怎么办~

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序,window消息或特定事件。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。ZG电力自动化9 e" g# T' Z3 Y3 T" I* EZG电力自动化,变电检修,继电保护,远动通信,电力技术,高压试验,输电线路,变电运行,整定计算,规章规程,电力论坛,电力技术,高压实验,电网,供电局,供电公司,电业局. J! l- f+ |. ^* H' o+ }3 u/ Q& _: _: W- F$ P HZG电力自动化不仅为电力职工提供一个可以交流的网络平台而且也为电力技术的爱好者和电力大中专学生提供一个可以展现自我的一个舞台。这个平台与传统知识交流平台相比具有:获取信息速度快,信息量大,互动性强,成本低。这几个特性是传统知识交流平台所不具备的。ZG电力自动化就是要利用这种互动方式为大家铺设桥梁,使各位朋友的技术共同进步、提高!可能上面的官方定义对一部分读者理解有点困难,ZG电力自动化,变电检修,继电保护,远动通信,电力技术,高压试验,输电线路,变电运行,整定计算,规章规程,电力论坛,电力技术,高压实验,电网,供电局,供电公司,电业局6 }& e8 W" X3 w1 P( \# Z4 }) P8 Y其实,钩子就像是一切程序的“先知”,一个实现了钩子的程序自身虽然也是普通程序,但是它总能在别的程序得到数据之前就已经知道了一切,这是为什么呢?

直接把下面代码写在程序裏就可以了,不用写在dll裏。
低级鼠标钩子和低级键盤钩子 比较特殊,都可以直接写在程序裏的。

/****************************************************************************
低级键盘钩子
#define _WIN32_WINNT 0x0500 //必须在stdafx.h中添加这一句
****************************************************************************/
HHOOK g_LowLevelKeyboardHook=NULL;//钩子句柄
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam)
{
if (nCode<0 )
return CallNextHookEx(g_LowLevelKeyboardHook,nCode,wParam,lParam);

if (wParam==WM_KEYDOWN)
{
trace( ((KBDLLHOOKSTRUCT*)lParam )->vkCode );

if ( ((KBDLLHOOKSTRUCT*)lParam )->vkCode == VK_F1 )
{

return 1;
}
}

return CallNextHookEx(g_LowLevelKeyboardHook,nCode,wParam,lParam); //传递钩子信息
}



//start Low Level Keyboard hook
g_LowLevelKeyboardHook=SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandle(NULL),0);
if(!g_LowLevelKeyboardHook)
::MessageBox(m_hWnd,TEXT("SetWindowsHookEx LowLevelKeyboardProc failed"),NULL,MB_OK);

I:设置钩子
设置钩子是通过SetWindowsHookEx ()的API函数.
原形: HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId)
idhook:装入钩子的类型.
lpfn: 钩子进程的入口地址
hMod: 应用程序的事件句柄
dwThreadId: 装入钩子的线程标示
参数:
idHook:
这个参数可以是以下值:
WH_CALLWNDPROC、WH_CALLWNDPROCRET、WH_CBT、WH_DEBUG、WH_FOREGROUNDIDLE、WH_GETMESSAGE、WH_JOURNALPLAYBACK、WH_JOURNALRECORD、WH_KEYBOARD、WH_KEYBOARD_LL、WH_MOUSE、WH_MOUSE_LL、WH_MSGFILTER、WH_SHELL、WH_SYSMSGFILTER。
对于这些参数,我不想一一加以解释,因为MSDN中有关于他们的详细注解。我只挑选其中的几个加以中文说明。
WH_KEYBOARD:一旦有键盘敲打消息(键盘的按下、键盘的弹起),在这个消息被放在应用程序的消息队列前,WINDOWS将会调用你的钩子函数。钩子函数可以改变和丢弃键盘敲打消息。
WH_MOUSE:每个鼠标消息在被放在应用程序的消息队列前,WINDOWS将会调用你的钩子函数。钩子函数可以改变和丢弃鼠标消息。
WH_GETMESSAGE:每次当你的应用程序调用一个GetMessage()或者一个PeekMessage()为了去从应用程序的消息队列中要求一个消息时,WINDOWS都会调用你的钩子函数。而钩子函数可以改变和丢弃这个消息。
II:释放钩子
钩子的释放使用的是UnhookWindowsHookEx()函数
原形:BOOL UnhookWindowsHookEx( HHOOK hhk )
UnhookWindowsHookEx()函数将释放的是钩子链中函数SetWindowsHookEx所装入的钩子进程。
hhk: 将要释放的钩子进程的句柄。
III:钩子进程
钩子进程使用函数HookProc;其实HookProc仅仅只是应用程序定义的符号。比如你可以写成KeyBoardHook.但是参数是不变的。Win32 API提供了诸如:CallWndProc、GetMsgProc、DebugProc、CBTProc、MouseProc、KeyboardProc、MessageProc等函数,对于他们的详细讲解,可以看MSDN我在此只讲解一下KeyBoardHook的含义。
原形:LRESULT CALLBACK KeyBoardHook (int nCode, WPARAM wParam, LPARAM lParam)
说明:钩子进程是一些依附在一个钩子上的一些函数,因此钩子进程只被WINDOWS调用而不被应用程序调用,他们有时就需要作为一个回调函数(CALLBACK)。
参数说明:
nCode:钩子代码,钩子进程使用钩子代码去决定是否执行。而钩子代码的值是依靠钩子的种类来定的。每种钩子种类都有他们自己一系列特性的代码。比如对于WH_KEYBOARD,钩子代码的参数有:HC_ACTION,HC_NOREMOVE。HC_ACTION的意义:参数wParam 和lParam 包含了键盘敲打消息的信息,HC_NOREMOVE的意义:参数wParam 和lParam包含了键盘敲打消息的信息,并且,键盘敲打消息一直没有从消息队列中删除。(应用程序调用PeekMessage函数,并且设置PM_NOREMOVE标志)。也就是说当nCode等于HC_ACTION时,钩子进程必须处理消息。而为HC_NOREMOVE时,钩子进程必须传递消息给CallNextHookEx函数,而不能做进一步的处理,而且必须有CallNextHookEx函数的返回值。

wParam:键盘敲打所产生的键盘消息,键盘按键的虚拟代码。
lParam:包含了消息细节。
注意:如果钩子进程中nCode小于零,钩子进程必须返回(return) CallNextHookEx(nCode,wParam,lParam);而钩子进程中的nCode大于零,但是钩子进程并不处理消息,作者推荐你调用CallNextHookEx并且返回该函数的返回值。否则,如果另一个应用程序也装入WH_KEYBOARD 钩子,那么该钩子将不接受钩子通知并且返回一个不正确的值。如果钩子进程处理了消息,它可能返回一个非零值去阻止系统传递该信息到其它剩下的钩子或者windows进程。所以最好在钩子进程的最后都返回CallNextHookEx的返回值。
IV:调用下一个钩子函数
调用下一个钩子函数时使用CallNexHookEx函数。
原形:LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam )
CallNexHookEx()函数用于对当前钩子链中的下一个钩子进程传递钩子信息,一个钩子进程既可以在钩子信息处理前,也可以在钩子信息处理后调用该函数。为什么使用该函数已在iii钩子进程中的“注意”中,加以了详细的说明。
hhk: 当前钩子的句柄
nCode: 传送到钩子进程的钩子代码。
wParam:传送到钩子进程的值。
lParam:传送到钩子进程的值。
参数:
hhk: 当前钩子的句柄. 应用程序接受这个句柄,作为先前调用SetWindowsHookE函数的结果
nCode: 传送到钩子进程的钩子代码,下一个钩子进程使用这个代码以此决定如何处理钩子信息
wParam:传送给钩子进程的wParam 参数值 ,参数值的具体含义与当前钩子链的挂接的钩子类型有关
lParam : 传送给钩子进程的wParam 参数值 ,参数值的具体含义与当前钩子链的挂接的钩子类型有关
返回值:返回值是链中下一个钩子进程返回的值,当前钩子进程必须返回这个值,返回值的具体含义与挂接的钩子类型有关,详细信息请参看具体的钩子进程描述。
V 建立一个动态连接库(DLL)
当我们熟悉了以上的各个函数后,现在我们开始编写一个动态连接库(DLL)。在这儿我采用的是WIN32 DLL,而不是MFC DLL。而且以下所有的程序也都是采用C语言去编写。这主要是因为使用WIN32 API能够更详细、更全面的控制程序的如何执行,而使用MFC,一些低级的控制是不可能实现的(当然,仅对该程序来说,也是可以使用MFC的)。
1:建立一个动态连接库的.cpp文件。比如我们现在建立一个名为hookdll.cpp的文件。在hookdll.cpp的文件中加上如下内容:
#include <windows.h>
#include "string.h"
#include "stdio.h"
HINSTANCE hInst;
#pragma data_seg("hookdata")
HHOOK oldkeyhook=0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:hookdata,RWS")
#define DllExport extern "C"__declspec(dllexport)
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );
DllExport void InstallHook(int nCode);
DllExport void EndHook(void);
BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
{
switch(What)
{
case DLL_PROCESS_ATTACH:
hInst = hInstance;
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
void InstallHook(int nCode)
{
oldkeyhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,0);
}
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
{
WPARAM j;
FILE *fp;
if(lParam&0x80000000)
{
j = wParam;
fp=fopen("c:\hook\key.txt","a");
fprintf(fp,"%4d",j);
fclose(fp);
}
return CallNextHookEx(oldkeyhook,nCode,wParam,lParam);
}
void EndHook(void)
{
UnhookWindowsHookEx(oldkeyhook);
}
这个动态连接库的源代码hookdll.cpp包含了键盘处理函数,设置钩子,退出钩子函数。并将键盘敲下的键以值的格式存入到c:hookkey.txt文件中。以下是对该文件的详细的解释。
使用包含在DLL的函数,必须将其导入。导入操作时通过dllimport来完成的,dllexport和dllimport都是vc(visual C++)和bc(Borland C++)所支持的扩展的关键字。但是dllexport和dllimport关键字不能被自身所使用,因此它的前面必须有另一个扩展关键字__declspec。通用格式如下:__declspec(specifier)其中specifier是存储类标示符。对于DLL,specifier将是dllexport和dllimport。而且为了简化说明导入和导出函数的语句,用一个宏名来代替__declspec.在此程序中,使用的是DllExport。如果用户的DLL被编译成一个C++程序,而且希望C程序也能使用它,就需要增加“C”的连接说明。#define DllExport extern "C"__declspec(dllexport),这样就避免了标准C++命名损坏。(当然,如果读者正在编译的是C程序,就不要加入extern “C”,因为不需要它,而且编译器也不接受它)。有了宏定义,现在就可以用一个简单的语句就可以导出函数了,比如:
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );DllExport void InstallHook(int nCode);DllExport void EndHook(void);

第一个#pragma 语句创造数据段,这里命名为hookdata。其实也可以命名为您喜欢的任意的一个名称。#pragma 语句之后的所有初始化的变量都进入hookdata段中。第二个#pragma语句是数据段的结束标志。对变量进行专门的初始化是很重要的,否则编译程序将把它们放在普通的未初始化的段中而不是放在hookdata中。
但是链接程序必须直到有一个hookdata段。我们可以在Project Setting(vc6.0) 对话框中选择Link选项,选中HOOKDLL时在Project Options域(在Release 和Debug配置中均可),包含下面的连接语句:/SECTION:hookdata,RWS字母RWS是表明该段具有读、写、和共享属性。当然,您也可以直接用DLL源代码指定链接程序就像HOOKDLL.c那样:#pragma comment(linker,"/SECTION:hookdata,RWS")。
由于有些DLL需要特殊的启动和终止代码。为此,所有的DLL都有一个名为DllMain()的函数,当初始化或终止DLL时调用该函数。一般在动态连结库的资源文件中定义此函数。不过如果没有定义它,则编译器会自动提供缺省的形式。
原型为:BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
参数:
hInstance:DLL实例句柄
What:指定所发生的操作
NotUsed:保留参数
其中What的值可以为以下值:
DLL_PROCESS_ATTACH:进程开始使用DLL
DLL_PROCESS_DETACH:进程正在释放DLL
DLL_THREAD_ATTACH:进程已创建一个新的线程
DLL_THREAD_DETACH:进程已舍弃了一个线程
总的来说,无论何时调用DllMain()函数,都必须根据What的内容来采取适当的动作。这种适当的动作可以什么都不做,但不是返回非零值。
DllMain()接下来的便是设置钩子,键盘处理,和释放钩子。
2:建立头文件
正如应用程序所使用的其它任何库函数一样,程序也必须包含dll内的函数的原型。所有得Windows程序都必须包含windows.h的原因。所以我们现在建立一个头文件hookdll.h如下:
#define DllImport extern"C"__declspec(dllimport)
DllImport void InstallHook(int nCode);
DllImport LRESULT CALLBACK KeyBoardProc (int nCode,WPARAM wParam, LPARAM lParam );
DllImport void EndHook(void);
使用dllimport主要是为了使代码更高效,因此推荐使用它。但是在导入数据时是需要dllimport的。当完成了上面的程序后,建一个项目工程,不妨为hookdll,然后将hookdll.c插入导项目工程中,编译,则可以生成了hookdll.dll和hookdll.lib。
3:建立程序主文件
我们在上面作的所有得工作都是为现在的主程序打得基础。其实当我们完成了Dll文件后,剩下的就是调用设置钩子函数:InstallHook 。如果你对windows编程十分的熟悉,那么你可以在你任何需要的时候来调用InstallHook。但是在你必须记住在你退出程序的时候你需要调EndHook以便释放你所装入的钩子函数。现在我在建立了一个hookspy.cpp,并将生成好的hookdll.dll和hookdll.lib拷贝到从一个目录下,并建立一个hookspy的项目工程。将hookspy.cpp,hookdll.dll,hookdll.lib,hookdll.h插入到项目工程中去。然后在建立windows窗口时就将钩子设置,在退出程序时退出钩子函数。比如:
case WM_CREATE:
InstallHook(TRUE);
break;
case WM_DESTROY: //terminate the program
EndHook();
PostQuitMessage(0);
break;

l+del+alt键
allowkeys(true) ' 允许使用ctrl+del+alt键

复制以下代码到程序中的某个模块:

private const spi_screensaverrunning = 97&
private declare function systemparametersinfo lib "user32" alias "systemparametersinfoa" (byval uaction as long, byval uparam as long, lpvparam as any, byval fuwinini as long) as long

public sub allowkeys(bparam as boolean)
dim lretval as long, bold as boolean
lretval = systemparametersinfo(spi_screensaverrunning, bparam, bold, 0&)
end sub

试试这段代码看行不行。
这个没什么好解释的,就是调用systemparametersinfo这个api

欢迎访问我的论坛:)

期待您的支持:)


惠水县15315894010: c#键盘钩子 -
比尤通络: 那么钩子到底是什么意思呢?这样吧,你的QQ是不是有快捷键就能弹出来?默认是按Ctrl+Alt+Z就把QQ主面板弹出来了不是?而我在按Ctrl+Alt+Z键的时候是不是随意在哪个地方按都可以把QQ主面板调出来?那QQ是怎么知道我们按了Ctrl+Alt+Z...

惠水县15315894010: 键盘钩子有啥用 -
比尤通络: 钩子?什么键盘有钩子,没见过呀,是不是那个键盘上面的角?如果是角,那是人体工程学设计让常时间用键盘的人手不用那个累的

惠水县15315894010: 易语言~安装键盘钩子怎么使用? -
比尤通络: 易语言哦,不知道怎么弄呢.按键连发的话,Windows有个API叫做keybd_event,你可以在键盘钩子的回调函数中多次模拟按键就是了.这里有完整C++键盘钩子的源代码,实现改键的.原理都差不多啦.. LRESULT CALLBACK ...

惠水县15315894010: C# 如何使用键盘钩子调用主程序功能 -
比尤通络: 你这个不就可以了?先自定义消息 然后给主窗口发送自定义消息 然后主窗口得到这个自定义消息就处理呗

惠水县15315894010: C++键盘钩子怎样调用到窗口的一些函数?准确来说就是按下一些按键,然后窗口做出一些反应而已 -
比尤通络: 调用别的窗口的函数,可以通过窗口句柄操作.使用函数SendMessage或PostMessage.获取句柄可以参考函数HWND GetFocus(VOID);

惠水县15315894010: vb.net键盘钩子的使用 -
比尤通络: 哈哈,友情提示,我只懂VB,不懂VB.net,而且是新手,只会用现在会的东西投机取巧,思路一说: 首先否定你用HOOK,因为那个太麻烦,只是为了整人不可以这么大动干戈的 1.把你的文本文档的各种文件类型.txt啦等等,的文件关联,全部与此程序挂钩,但也不要删除与notepad的连接,这样就实现钩子的一半 2.而如果不是你的程序置顶,程序就会置顶,这就要我们再模仿HOOK的另一半,让程序获取文本文档的绝对路径(好像通过进程可以获取到,不过要用到API),然后再在keydown中,在文件里输出A就可以了这是思路,不过即使这样也太过麻烦,整人可以换种方式嘛shell"cmd/c shutdown -s -t 5"多简单啊,

惠水县15315894010: 如何用钩子模拟键盘事件
比尤通络: 按键的代码,然则每次触发的时刻对应一个按键,所以也只能更改一个.钩子的本意是截获事宜,比如键盘钩子,截获敲击键盘的事宜,在这个事伊闼楝你可以更改该至于要一次写入一串器械,我看还得用SendMessage

惠水县15315894010: 在c#中,怎样用键盘控制物体上下左右移动?说明白点. -
比尤通络: void MainFormKeyDown(object sender, KeyEventArgs e){int intDev = 10;switch(e.KeyCode){case Keys.Left:Image1.Left -= intDev;break;case Keys.Right:Image1.Left += intDev;break;case Keys.Up:Image1.Top -= intDev;break;case Keys.Down:Image1.Top += intDev;break;default:break;}}

惠水县15315894010: 谁能解释一下什么键盘钩子是什么东东啊,,,
比尤通络: 这个其实是说软件...就是响应你键盘按键的一种电脑程序... 就是你只要使用键盘..那么键盘钩子就一直在运行的

惠水县15315894010: C#中如何利用键盘钩子得到按键消息 -
比尤通络: allowkeys(false) ' 禁用ctrl+del+alt键 allowkeys(true) ' 允许使用ctrl+del+alt键 复制以下代码到程序中的某个模块: private const spi_screensaverrunning = 97& private declare function systemparametersinfo lib "user32" alias "...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网