全局低级键盘钩子[通俗易懂]

全局低级键盘钩子[通俗易懂]/*========================================================================文件:kbevent.h说明:全局消息钩子时间:2005-03-20编写:oshj||oshj@21cn.c

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

文件: 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;
}

文章转自:http://blog.vckbase.com/flowsand/archive/2006/11/30/23312.html

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140934.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • CNN经典模型汇总[通俗易懂]

    CNN经典模型汇总[通俗易懂]本文主要对CNN领域的经典模型进行汇总,算是对近期的学习做一个小总结。基础知识作为深度学习的基础,神经网络这个算法是必须要有深入的了解的,这里不介绍太多,简单介绍一下原理和单个神经元的结构:一、BP神经网络的概念BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:BP神经网络的过程主要分为两个阶段,第一阶段是信号

  • 串口助手(简洁版)上位机软件零基础教程( C# + visual studio2017 )(一)[通俗易懂]

    串口助手(简洁版)上位机软件零基础教程( C# + visual studio2017 )(一)[通俗易懂]本人所在铁人战队的实验室同学们主要从事单片机的编程开发。但比赛和项目过程中,常常都需要与机器人进行人机交互。虽然实验室常用的HMI串口屏能满足我们的基本需求,但没东西在手的时候,就是个难题了。所以本文则介绍一下使用visualstudio软件,进行C#上位机软件的开发入门。以同学们常用的串口助手(简洁版)为例,来着手进行学习和入门。由于笔者知识有限,且是第一次写博客,有不足或错误之处,还…

  • wireshark抓取dns数据包_2021年dns

    wireshark抓取dns数据包_2021年dns实验步骤一根据实验环境,本实验的步骤如下:1、测试环境中获取DNS数据包。2、分析DNS数据包。任务描述:获取两种类型的DNS数据包(1)通过浏览器访问域名(www.baidu.com)来获取DNS数据虽然合天实验室环境下,无法抓取此部分数据包(其实也可以自己搭建服务器,配置DNS服务器,但设计者比较懒,就将就下吧),但设计者希望学习的人能根据例子在自己的笔记本上抓取,然后分析。我们以登录www.baidu.com来获取DNS数据,启动Wireshark,在Filter中输入dns。打开浏览器

  • phpstorm新版激活码_在线激活[通俗易懂]

    (phpstorm新版激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • springboot websocket 跨域_前端websocket框架

    springboot websocket 跨域_前端websocket框架WebSocket是HTML5开始提供的⼀种在单个TCP连接上进⾏全双⼯通讯的协议,可以实现跨域访问。websocket安装命令npmiws-S服务器端:letWebServerSocket=require(“ws”).Server;letwss=newWebServerSocket({port:8200});constmysql=require(“…

  • Docker(三)- 从镜像运行启动容器「建议收藏」

    Docker(三)- 从镜像运行启动容器「建议收藏」文章目录从镜像运行启动容器容器启动后运行的命令`ENTRYPOINT`和`CMD`启动容器时覆盖`ENTRYPOINT`和`CMD“-d`后台运行`dockerexec`进入容器,运行指定命令`–name`和`–restart=always“–rm`和`dockercp`从镜像运行启动容器从一个镜像可以运行启动一个或多个容器。所谓容器,我们可以理解为是一个虚拟的计算机,其中运行着操作系统,操作系统中运行着我们部署的应用。从tomcat镜像启动容器:do

发表回复

您的电子邮箱地址不会被公开。

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