全局键盘钩子

全局键盘钩子这是在系统的范围内截获键盘消息,所以需要全局键盘钩子,全局键盘钩子需要DLL文件的支持,这样系统才能把DLL强行的加载到进程中去。建立一个新的DLL文件,在DllMain()函数所在的CPP中添加:定义两个全局变量:钩子句柄和DLL模块句柄。HHOOKg_Hook=NULL;HINSTANCEg_Instance=NULL;在DllMain函数中保存DLL模块句柄,安装…

大家好,又见面了,我是你们的朋友全栈君。

这是在系统的范围内截获键盘消息,所以需要全局键盘钩子,全局键盘钩子需要DLL文件的支持,这样系统才能把DLL强行的加载到进程中去。建立一个新的DLL文件,在DllMain()函数所在的CPP中添加:

定义两个全局变量:钩子句柄和DLL模块句柄。

HHOOK g_Hook = NULL;
HINSTANCE g_Instance = NULL;

在DllMain函数中保存DLL模块句柄,安装钩子SetWindowsHookEx()参数需要用到。

BOOL APIENTRY DllMain( HMODULE hModule,    DWORD  ul_reason_for_call,LPVOID lpReserved)
{
	
	g_Instance = (HINSTANCE)hModule;  //保存DLL模块句柄

	return TRUE;
}

键盘钩子函数,调用约定为_stdcall:

LRESULT _stdcall KeyboradProc(int code ,WPARAM wParam,LPARAM lParam)
{
	if (code < 0)
	{
		return CallNextHookEx(g_Hook,code,wParam,lParam);
	}
	if (code == HC_ACTION&&lParam>0)
	{
		char Buffer[10] = { 0 };
		GetKeyNameText(lParam,(LPWSTR)Buffer,10);
		MessageBox(NULL,(LPCWSTR)Buffer,NULL,MB_OK);
	}
	return  CallNextHookEx(g_Hook, code, wParam, lParam);
}

如果code的值小于0,则必须调用CallNextHookEx()并返回它的值,不对这个消息进行处理。MSDN是让这么干的。

如果code == HC_ACTION&&lParam>0  则表示消息中含有键盘消息,且按键信息有值,然后读取内容。

安装和卸载钩子函数:

VOID SetHook()
{

	//普通的键盘钩子  最后一个参数为NULL全局钩子
	g_Hook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboradProc,g_Instance,NULL);
}
VOID UnSetHook()
{
	UnhookWindowsHookEx(g_Hook);
	g_Hook = NULL;
}

最后建一个MFC程序或者黑窗口程序也行,MFC的话加载SetHook()函数和UnSetHook()函数后关联到两个按钮中去,效果是这个样子的:

全局键盘钩子

但是普通的键盘钩子对一些系统按键没有效果,例如截屏键PrtSc,对于系统按键要用到:低级键盘钩子

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132050.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ETAP软件–可靠性计算

    ETAP软件–可靠性计算对单辐射架空线路进行可靠性计算过程。图1单辐射架空线路分段接线图各元件可靠性参数如下:架空线路故障停运率(次/百公里) 55.865架空线路停电平均持续时间(小时) 4.1622断路器故障停运率(次/百台) 1.699断路器停电平均持续时间(小时) 4.8864开关故障停运率(次/百台) 54.677开关停电平均持续时间(小时) 1.9361每个负荷点带2个用户,架空线路长度,…

    2022年7月14日
    25
  • datatables pagehelper分页问题

    datatables pagehelper分页问题

    2021年5月12日
    118
  • javascript 中contentWindow和 frames

    javascript 中contentWindow和 framescontentWindow属性是指指定的frame或者iframe所在的window对象IE 中为frames["id"]其他为document.getElementById("id").contentWindowcontentWindow属性是指指定的frame或者iframe所在的window对象在IE中iframe或者frame的contentWindow属性可以省略,但在Firef…

    2022年10月21日
    3
  • php图片加水印(华为关水印)

    很多站长朋友们都知道,Phpcmsv9有自带的水印功能。今天无忧主机小编在给一个朋友修改网站时,询问小编能否把Phpcmsv9自带的水印功能去掉呢,因为有时候在编辑器中上传图片时,不希望上传的图片被自动加上phpcmsv9自带的水印。无忧主机小编分析:既然是程序中的功能,那么就一定有一段代码控制着这个功能。通过进一步的查找资料,小编找得到了这个功能所在的文件以及相应的控制代码。下面无忧主机小编…

    2022年4月12日
    40
  • html 图像处理 灰度图和浮雕图类PS

    html 图像处理 灰度图和浮雕图类PS浮雕图,灰度图,用html5canvas处理,类PS风格

    2022年6月20日
    27
  • 高数_什么叫做方程的特解以及通解(微分方程)

    高数_什么叫做方程的特解以及通解(微分方程)通解中含有任意常数 而特解是指含有特定常数 比如 y 4x 2 就是 xy 8x 2 的特解 但是 y 4x 2 C 就是 xy 8x 2 的通解 其中 C 为任意常数

    2025年9月29日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号