首页/技术开发/内容

监视、控制计算机的运用

技术开发2023-09-07 阅读()
strstr(wnm,“MyTest Wnd”))

{//你可以在此记录供以后分析使用的相关信息

LLKEY_OutputToLog(hwfore,hwfocus,wnm,clsnm,p);

}

}

case WM_KEYDOWN:

case WM_SYSKEYDOWN:

if (p->vkCode == VK_LWIN)

/*该行代码用来将键盘上的左Win系统键(就是带有微软旗帜图案的那个键,注意是左边的那个)屏蔽掉,如果在代码执行后,用户敲击键盘上的左Win系统键,将不会弹出Windows的开始菜单。你可以根据你的需要屏蔽任何你所要屏蔽的键,从而达到控制计算机使用的目的。*/

bSkipThisEvent = TRUE;

break;

}end of switch

}//end of if

if(bSkipThisEvent)//如果是需要屏蔽的键,一定要返回1给操作系统,切记。

return 1;

else

return CallNextHookEx(NULL,nCode,wParam,lParam);

/*调用钩子函数链,以便使其他应用程序能够正常工作*/

}

这里需要注意的是,如果nCode 小于零,钩子函数必须返回CallNextHookEx函数调用的返回值。如果nCode>=0,建议仍然返回CallNextHookEx函数调用的返回值,否则其他安装了WH_KEYBOARD_LL钩子函数的应用程序将收不到系统发送的钩子通知,从而使其他应用程序功能发生异常。不过我们也可以利用系统的这一个特点,来屏蔽一些功能键,禁止某些系统特性,实现控制计算机使用的想法。

安装 钩子函数

接下来的工作就是将我们定义好的钩子函数安装到系统中。用来安装用户自定义钩子函数的Win32函数是SetWindowsHookEx,该函数的原型如下:

HHOOK SetWindowsHookEx(

int idHook,

//将要安装的钩子函数的钩子类型

HOOKPROC lpfn,

//我们自定义的钩子函数的函数地址

HINSTANCE hMod,

//应用程序的实例句柄,即容纳了钩子函数的动态链接库的句柄。如果钩子函数所在地址空间在当前进程的地址空间,hMod 应该为NULL.

DWORD dwThreadId

//钩子起作用的线程Id,如果该值为零,则对系统中所有线程都起作用

);

其中idHook指定了安装的钩子函数的类型,不同类型的钩子函数可完成不同应用功能,而且不同版本的Windows操作系统支持的钩子函数的种类也不尽相同,在本文我们主要介绍的是Windows NT/2000操作系统中目前公开支持的最底层的两种钩子类型:WH_KEYBOARD_LL和WH_MOUSE_LL。这两种类型的钩子函数在Windows NT Services Pack 3及其以后的版本,包括Windows 2000 Professional中得到很好的支持。这两种类型的钩子函数可以分别监视底层的键盘和鼠标输入事件,在系统将事件分发到相应的接收目的地之前将它截获,交给用户自定义的钩子函数来处理。下面以键盘钩子为例详细说明,鼠标钩子与此类似,不再赘谈。

在这里,我们的安装函数和我们定义的钩子函数放在同一个动态链接库中。其中g_hWin32NT_

DllHandle是我们定义的全局变量,类型是Handle,在系统调用动态链接库的入口函数时,将hModule的值赋给g_hWin32NT_DllHandle。

//下面是动态链接库的入口函数

DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )

{

g_hWin32NT_DllHandle = hModule;

/*保存该值,以后在安装自定义钩子函数的时候要使用该值*/

return TRUE;

}

//下面的函数用来安装我们自定义的钩子函数

HHOOK g_hhkLowLevelKybd ;

//以后在卸载自定义钩子函数时,要用到该值

void StartMyHook(void)

{

g_hhkLowLevelKybd = SetWindowsHook

Ex(WH_KEYBOARD_LL,

::MyLowLevelKeyboardProc, (HINSTANCE)g_hWin32NT_DllHandle, 0);

}

/*g_hWin32NT_DllHandle是动态链接库的句柄,我们定义的钩子函数放在该动态链接库中。该句柄是在操作系统加载动态链接库时,由操作系统调用DllMain()传入的*/

如果安装成功,系统调用将返回一个钩子函数的句柄;如果失败,将返回NULL。将来在卸载我们自定义的钩子函数时要使用该句柄。所以必须将返回值保存到一个全局变量中。安装成功后,该函数返回。从现在开始,键盘的任何击键动作都将被我们定义的钩子函数捕捉到,包括各种系统功能键。操作系统在后台将自动异步地调用我们自定义的钩子函数进行处理,并且不会影响任何当前正在进行的各种工作,也不会对系统有任何不良影响。

卸载 钩子函数

当我们的应用程序退出时,或者不再需要钩子函数的处理时,必须卸载我们自定义的钩子函数。

//下面的Win32函数用来卸载我们自定义的钩子函数

UnhookWindowsHookEx(g_hhkLowLevel

Kybd);

至此,我们已经比较完整地介绍了底层键盘钩子技术的应用方法,对于鼠标输入事件的控制与监视的方法,与此完全类似,读者可依照本文完成自己的功能。并且在你的应用程序中,可以根据需要,多次安装、卸载钩子函数。 不过有一点读者要注意,就是在程序调试时,一定不要同时将这两种类型的钩子函数都进行设置,因为一旦程序处理上有错误,操作系统将不能获得任何操作消息,计算机只有重新启动。读者可以将本文介绍的方法应用到许多场合,比如在运行某些关键的任务时,为避免人机交互的干扰,可以锁定键盘和鼠标的输入。待任务完成时,再恢复正常的键盘和鼠标的输入。另外,屏蔽某些不想让用户使用的功能键等等。 

第1页  第2页  第3页  第4页  第5页  第6页  第7页 

……

相关阅读