// Test_Hook.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
#include <WinError.h>// Some global variables
HINSTANCE g_Instance;   // Handler of current instance
HHOOK     g_Hook;       // Handler of hookBOOL SetHook();
BOOL UnSetHook();// The hook function (will be called by other processes)
static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);//
//odprintf -- debug function
void __cdecl odprintf(const char* fmt, ...)
{char buf[4096], *p = buf;va_list args;va_start(args, fmt);p += vsnprintf_s(p, sizeof(buf), _TRUNCATE, fmt, args);va_end(args);while ( p > buf  &&  isspace(p[-1]) )*--p = '\0';*p++ = '\r';*p++ = '\n';*p   = '\0';OutputDebugStringA(buf);  //output as ANSI string //OutputDebugString
}LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{KBDLLHOOKSTRUCT* pkh = (KBDLLHOOKSTRUCT*)lParam;//HC_ACTION: wParam 和lParam参数包含了键盘按键消息if (nCode == HC_ACTION) {if (::GetAsyncKeyState('1') & 0x8000){odprintf("111111111111111111");}//判断函数调用时指定虚拟键的状态//BOOL bCtrlKey =    ::GetAsyncKeyState(VK_CONTROL) & 0x8000;BOOL bCtrlKey =    ::GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);if ((pkh->vkCode == VK_ESCAPE && bCtrlKey) ||                  // Ctrl+Esc 开始菜单(pkh->vkCode == VK_TAB    && pkh->flags & LLKHF_ALTDOWN) ||        // Alt+TAB 屏幕切换菜单(pkh->vkCode == VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN) ||       // Alt+Esc 屏幕切换 (pkh->vkCode == VK_LWIN   || pkh->vkCode==VK_RWIN)               // 左右Windows键)  {       odprintf("ok...i'am come here!");        //这里会出现两次, 因为return 1; }}// Call next hook in chainreturn ::CallNextHookEx(g_Hook, nCode, wParam, lParam);
}BOOL SetHook()
{if (g_Instance || g_Hook)      // Already hooked!return TRUE;g_Instance = (HINSTANCE)::GetModuleHandle(NULL);g_Hook     = ::SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardProc, g_Instance, 0);if (!g_Hook){odprintf("SetHook error, error code=%ld", ::GetLastError()); //error codereturn FALSE;}return TRUE;                              // Hook has been created correctly
}BOOL UnSetHook()
{if (g_Hook) {                              // Check if hook handler is valid::UnhookWindowsHookEx(g_Hook);         // Unhook is done hereg_Hook = NULL;                           // Remove hook handler to avoid to use it again}return TRUE;                                // Hook has been removed
}int _tmain(int argc, _TCHAR* argv[])
{odprintf("Test of KeyboardProc, starting...");if (!SetHook())return -1;MSG msg;while(::GetMessage(&msg, NULL, 0, 0) > 0){TranslateMessage(&msg);DispatchMessage(&msg);}//clean:UnSetHook();return 0;
}

win32程序测试键盘钩子相关推荐

  1. [C++]键盘钩子程序

    实现适时监视键盘,并将按键信息保存在TXT文件中的程序 Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它 ...

  2. 一个简单的键盘钩子程序(ZZZ)

    一个简单的键盘钩子程序 从哪儿抄来的忘了,不过写的很简单明了 实现适时监视键盘,并将按键信息保存在TXT文件中的程序         Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都 ...

  3. 一个简单的键盘钩子程序

    Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序 ...

  4. 利用键盘钩子开发按键发音程序

    前言 一日,看见我妈正在用电脑练习打字,频频低头看键盘,我想:要是键盘能发音的话,不就可以方便她养成"盲打"的好习惯吗?光想不做可不行,开始行动 按键能发音,其关键就是让程序能够知 ...

  5. 汇编语言: 从键盘上输入一串字符(用回车键结束,使用 10 号功能调用。)放在 STRING 中,试 编制一个程序测试字符串中是否存在数字。如有,则把 CL 的第 5 位置 1,否则将该位置置 0。

    从键盘上输入一串字符(用回车键结束,使用 10 号功能调用.)放在 STRING 中,试 编制一个程序测试字符串中是否存在数字.如有,则把 CL 的第 5 位置 1,否则将该位置置 0. data s ...

  6. 如何让你的程序避开全局键盘钩子的监视

    原文地址:http://blog.okbase.net/BlueSky/archive/3839.html 一直以来有个疑问,就是如果别人在你的电脑上安装了键盘钩子来监视你的键盘按键动作,我的程序怎么 ...

  7. 自己写一个键盘钩子程序来监视键盘输入

    "钩子是Windows的消息监视点,应用程序可以在这里安装一个监视子程序,这样就可以在系统中的消息流到达目的窗口过程前监控它们" 上面就是WIN32API手册中对钩子的描述.大概就 ...

  8. 钩子原理及实例:实现键盘钩子截获密码

    钩子原理及实例:利用鼠标键盘钩子截获密码 钩子原理 钩子能截获系统并得理发送给其它应用程序的消息,能完成一般程序无法完成的功能.Windows系统是建立在事件驱动的机制上的,也就是整个系统都是通过消息 ...

  9. 低级键盘钩子,在WIN7以上版本的问题

    最近在项目用到低级键盘钩子.发现一个很奇怪的事情,在开发环境和测试环境下都正常运行的键盘钩子, 到了现场环境,总是偶发性出现 键盘钩子不能用了,而且退出时产生1404 错误. 后经过阅读MSDN 的R ...

最新文章

  1. Python学习(10)元组
  2. InfluxDB存储引擎Time Structured Merge Tree——本质上和LSM无异,只是结合了列存储压缩,其中引入fb的float压缩,字串字典压缩等...
  3. 将给出的整数x翻转_每日一题:1.罗马数字转整数
  4. 大学计算机课程操作文档,计算机操作系统大学课程.pptx
  5. 对比学习系列论文SimROD(二): A Simple Adaptation Method for Robust Object Detection
  6. solr管理界面详解
  7. 我看TechEd 2012之技术热点
  8. flex 左右布局_面试必考点:前端布局知识
  9. 类型的方法,以及关于Stringbuffer和String builder的相关补充
  10. 8183微型计算机,佳木斯大学12年微机原理复习题..doc
  11. 数据库设计实例(以一张表为例)
  12. 为什么我们需要PRINCE2认证——上海信息化培训中心
  13. 解决你的R语言乱码问题
  14. 微信小程序 position: absolute位置错乱问题
  15. OSPF(三)OSPF域内路由
  16. ltv价值 应用_手游LTV(用户终生价值)计算公式
  17. APS生产排单软件模拟排程功能
  18. 【仙女踩坑实录】Macbook修改文件创建时间
  19. coreldraw凹槽_CATIA课时:操作工具栏创建修剪分割曲面视频教程_翼狐网
  20. 闲人的命令执行漏洞基础学习1

热门文章

  1. iomem—I/O映射方式的I/O端口和内存映射方式的I/O端口
  2. XI 安装MS SQLSERVER JDBC 驱动
  3. JAVA中string的赋值_Java中关于String赋值的两种形式
  4. [蓝桥杯][算法提高VIP]学霸的迷宫(bfs+dfs)
  5. 13计算机组装,计算机组装与维修—教案13 .pdf
  6. html的带分页的表格写法,Html表格分页
  7. php服务器 下载,php实现从服务器下载文件
  8. 数据库关机_数据库:MySQL常见的三种存储引擎InnoDB、MyISAM、MEMORY的区别?
  9. 『设计模式』 又谈麦当劳的食品--组合模式(Composite)
  10. 『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试)