底层键盘钩子
/*========================================================================
文件: kbevent.h
说明:全局消息钩子
时间:2005-03-20
编写:oshj || oshj@21cn.com
环境:VC6.0/Win2000 Pro/SP4/1024*768
特别说明:NT5.0以上操作系统才能支持,WIN9X不支持!
=========================================================================*/
//-------------------------------------------------------------------------
#ifndef _INC_KEEVENT
#define _INC_KEEVENT
#include <windows.h>
#include <stdio.h>
//-------------------------------------------------------------------------
#define DLLEXPORT extern "C" __declspec(dllexport)
//-------------------------------------------------------------------------
#define MAX_TEXTLEN 1024
#define UM_GETTEXT WM_USER + 0x392
//-------------------------------------------------------------------------
//低级键盘钩子回调函数
LRESULT CALLBACK LowLevelKBProc(int nCode, WPARAM wParam, LPARAM lParam);
//按ctrl+alt+del时系统管理器无效
void RegKeyEnable(BOOL bEnable=TRUE);
///////////////////////////////////////////////////////////////////////////
//键盘空虚时间回调函数
LRESULT CALLBACK MyKbdHook(int code, WPARAM wParam, LPARAM lParam);
//鼠标空虚时间回调函数
LRESULT CALLBACK MyMouseHook(int code, WPARAM wParam, LPARAM lParam);
//-------------------------------------------------------------------------
#endif // _INC_KEEVENT
//.cpp
//-------------------------------------------------------------------------
#define _WIN32_WINNT 0x0500 //仅NT5.0以上系统可用
#include "kbevent.h"
//-------------------------------------------------------------------------
// Magic registry key/value for "Remove Task Manager" policy.
#define HKCU HKEY_CURRENT_USER
LPCTSTR KEY_DisableTaskMgr =
"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
LPCTSTR VAL_DisableTaskMgr = "DisableTaskMgr";
//-------------------------------------------------------------------------
#pragma data_seg(".sdata")
HHOOK g_hHookKeybd = NULL;
HHOOK g_hHookMouse = NULL;
DWORD g_dwLastInputTick = 0;
#pragma data_seg()
#pragma comment(linker,"-section:.sdata,rws")
//-------------------------------------------------------------------------
// 全局变量
HINSTANCE g_hInstance = NULL; // 模块实例句柄
HHOOK g_hHook = NULL; // 钩子句柄
//-------------------------------------------------------------------------
//dll main
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
// 保存模块实例句柄
g_hInstance = (HINSTANCE)hinstDLL;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
if( NULL!=g_hHook )
UnhookWindowsHookEx( g_hHook );
if( NULL!=g_hHookKeybd )
UnhookWindowsHookEx( g_hHookKeybd );
if( NULL!=g_hHookMouse )
UnhookWindowsHookEx( g_hHookMouse );
break;
}
return TRUE;
}
//-------------------------------------------------------------------------
// 底层键盘钩子函数
LRESULT CALLBACK LowLevelKBProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
PKBDLLHOOKSTRUCT p;
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
p = (PKBDLLHOOKSTRUCT)lParam;
if( //(p->vkCode==VK_TAB) ||
(p->vkCode==VK_ESCAPE) ||
(p->vkCode==VK_LWIN) ||
(p->vkCode==VK_RWIN) ||
(p->vkCode==VK_CONTROL) ||
(p->vkCode==VK_SHIFT) ||
(p->vkCode==VK_DELETE) ||
( (p->vkCode==VK_F4) && ((p->flags & LLKHF_ALTDOWN)!=0) ) || //ALT+F4
( (p->vkCode==VK_TAB) && ((p->flags & LLKHF_ALTDOWN)!=0) ) || //ALT+TAB
( (p->vkCode==VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN)!=0) ) || //ALT+ESC
( (p->vkCode==VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000)!=0) ) || //CTRL+ESC
( (p->vkCode==VK_DELETE) && ((p->flags & LLKHF_ALTDOWN)!=0) && ((GetKeyState(VK_CONTROL) & 0x8000)!=0) ) //CTRL+ESC
)
{
return TRUE;
}
break;
}
}
return ::CallNextHookEx( g_hHook, nCode, wParam, lParam );
}
//-------------------------------------------------------------------------
//开始钩子
DLLEXPORT BOOL WINAPI StartKBEvent()
{
//如果已经安装键盘钩子则返回 FALSE
if ( NULL!=g_hHook ) return FALSE;
RegKeyEnable(FALSE);
//安装底层键盘钩子
//NT5.0以上操作系统才能支持
//WIN98不支持!
g_hHook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKBProc, g_hInstance, NULL );
if ( g_hHook==NULL) return FALSE;
return TRUE;
}
//-------------------------------------------------------------------------
//结束钩子
DLLEXPORT BOOL WINAPI StopKBEvent()
{
RegKeyEnable(TRUE);
//卸载钩子
if( UnhookWindowsHookEx(g_hHook)==0 )
return FALSE;
g_hHook = NULL;
return TRUE;
}
//-------------------------------------------------------------------------
//按ctrl+alt+del时系统管理器无效
void RegKeyEnable(BOOL bEnable)
{
HKEY hk;
if( RegOpenKey(HKCU, KEY_DisableTaskMgr,&hk)!=ERROR_SUCCESS )
{
RegCreateKey(HKCU, KEY_DisableTaskMgr, &hk);
}
//
if( TRUE==bEnable )
{
RegDeleteValue(hk,VAL_DisableTaskMgr);
}
else
{
DWORD val=1;
RegSetValueEx(hk, VAL_DisableTaskMgr, NULL,REG_DWORD, (BYTE*)&val, sizeof(val));
}
}
///////////////////////////////////////////////////////////////////////////
//以下是获取键盘鼠标空闲时间的钩子部分
//-------------------------------------------------------------------------
//键盘空闲时间回调函数
LRESULT CALLBACK MyKbdHook(int code, WPARAM wParam, LPARAM lParam)
{
if( code==HC_ACTION )
{
g_dwLastInputTick = GetTickCount();
PKBDLLHOOKSTRUCT p;
p = (PKBDLLHOOKSTRUCT) lParam;
//MessageBox(0,"111","aaa",MB_OK);
//Z键连续按下2次以上
if( (p->vkCode==VK_ESCAPE) )// && ((p->flags & KF_REPEAT)>=2) )
{
//MessageBox(0,"yes","aaa",MB_OK);
return TRUE;
}
}
return ::CallNextHookEx( g_hHookKeybd, code, wParam, lParam );
}
//-------------------------------------------------------------------------
//鼠标空闲时间回调函数
LRESULT CALLBACK MyMouseHook(int code, WPARAM wParam, LPARAM lParam)
{
if (code==HC_ACTION)
{
g_dwLastInputTick = GetTickCount();
}
return ::CallNextHookEx( g_hHookMouse, code, wParam, lParam );
}
//-------------------------------------------------------------------------
//开始钩子
DLLEXPORT BOOL WINAPI IdleInit()
{
if( NULL!=g_hHookKeybd && NULL!=g_hHookMouse ) return FALSE;
g_hHookKeybd = SetWindowsHookEx( WH_KEYBOARD, MyKbdHook, g_hInstance, 0 );
g_hHookMouse = SetWindowsHookEx( WH_MOUSE, MyMouseHook, g_hInstance, 0 );
g_dwLastInputTick = GetTickCount();
return TRUE;
}
//-------------------------------------------------------------------------
//结束钩子
DLLEXPORT BOOL WINAPI IdleExit()
{
if( NULL==g_hHookKeybd && NULL==g_hHookMouse ) return FALSE;
UnhookWindowsHookEx( g_hHookKeybd );
UnhookWindowsHookEx( g_hHookMouse );
return TRUE;
}
//-------------------------------------------------------------------------
//获得空闲时间
DLLEXPORT DWORD IdleGetLastTime()
{
return g_dwLastInputTick;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)