win32程序测试键盘钩子

// 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;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SOA的未解之谜

虽然围绕着SOA有数以千计的出版物、提供商和分析师的吹嘘&#xff0c;以及SOA曾被宣布死亡然后又在SOA宣言中重生的事实&#xff0c;但是该话题周围仍然存在许多疑团。McKendrick在他最新的一篇博文对此进行了讨论。\u0026#xD;\nSOA与云计算之间的区别&#xff1f;David Linthi…

状态机设计技术

状态机设计技术 就理论而言,任何时序模型都可以归结为一个状态机。 状态机的优势 (1)高效的过程控制模型。 (2)容易利用现成的EDA工具进行优化设计。 (3)系统性稳定。 (4)高速性能。 (5)高可靠性能。 VHDL状态机的一般结构 从信号输出方式分,有Mealy和Moore型两…

Linux文件系统目录结构

进入Linux根目录&#xff08;即“/”&#xff0c;Linux文件系统的入口&#xff0c;也是处于最高一级的目录&#xff09;&#xff0c;运行“ls–l”命令&#xff0c;看到Linux包含以下目录。1./bin包含基本命令&#xff0c;如ls、cp、mkdir等&#xff0c;这个目录中的文件都是可…

藉上帝之旨,行时代之命的文学长征

——张炜长篇小说《你在高原》阅读笔记 阅读张炜的小说我从来没有过陌生感&#xff0c;这种感觉正如卡尔维诺对经典作品的比喻。他说&#xff1a;“一部经典作品是一本即使初读也好像是在重温的书。”我读张炜的作品就是这种感受&#xff0c;舒展的过程如同一场对往事前尘的追忆…

SSE指令集

SSE指令集的介绍网上一大堆, 这里贴一个用VS2008环境下的SSE测试程序, 分别用C代码, C内联汇编, C的SSE Intrinsics三种方式计算卷积的程序...这是一个win32控制台程序..... 程序下载地址 : http://download.csdn.net/detail/hemmingway/4598506 主文件的代码一览: // Test_SSE…

书评“世界杯”

昨天晚上&#xff0c;手捧《哈扎尔词典》的米洛拉德帕维奇以1比0敲碎了君特格拉斯的《铁皮鼓》&#xff1b;斯拉沃热齐泽克拎着《伊拉克&#xff1a;借来的壶》2比2浇灭了贝侯赛因奥巴马的《我父亲的梦想》和他《无畏的希望》。 今天早上&#xff0c;0比0&#xff0c;史蒂文杰拉…

VHDL仿真流程

VHDL仿真流程 VHDL测试平台Test Bench的主要功能有4种 例化待验证的模块实体通过VHDL程序的行为描述,为待测模块实体提供激励信号收集待测模块实体的输出结果,必要时将该结果与预置的所期望的理想结果进行比较,并给出报告根据比较结果自动判断模块的内部功能结构是否正确简…

实现ftoa与itoa

/********************************************************************************************* Name : 浮点型转字符* Brief : none* Input : str:字符串指针 num:浮点数 n:精度* Output : none* Return : none***************************************************…

Apache Nuvem将带来更多的开源云?

只要你过去几年没被困在荒岛上出不来&#xff0c;你就不可能不知道人们在云上所花费的巨大心力。无论你是否相信云将成为软件的一个“根本转变”&#xff0c;毋庸置疑的是未来几年将是云的世界。虽然现在谈很多标准还为时尚早&#xff0c;但我们开始看到在安全/识别及基本架构等…

两个C++毫秒级定时器

Win32控制台测试程序如下, 其中完整的程序代码下载是: http://download.csdn.net/detail/hemmingway/4600235 // Test_Time.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include "Timer.h" #include "TimeCounter.h"#define N 1…

狼行天下:追寻狼迹内蒙生态行第二天(续1)

临近傍晚的乌力亚思太山谷。乱云中的敖包和写有藏经文的旗帜。 我搭的帐篷。别看很小&#xff0c;可以住两个人。 能够睡6个人的巨大的帐篷&#xff0c;需要几个人才可以搭建起来。 夕阳把草原染成了赤金色。 《时尚健康》的三条汉子裹挟了自己的美女。这片草地&#xff0c;这堆…

VHDL子程序

VHDL子程序 VHDL子程序(SUBPROGRAM)是一个VHDL程序模块,这个模块利用顺序语句来定义和完成算法,因此只能使用顺序语句。这一点与进程相似,所不同的是,子程序不能像进程那样可以从本结构体的并行语句或其他进程结构中直接读取信号值或者向信号赋值。 VHDL子程序与其他软件…

stm8因为固定中断向量表地址引发的一系列问题及其处理

转载&#xff1a;https://blog.csdn.net/chen244798611/article/details/51334489 因为之前写个stm32的IAP升级程序&#xff0c;所以我总结了做IAP升级的三个主要的难点&#xff1a; 1、如何设置中断向量&#xff0c;也就是说中断向量的重定向 2、如何配置程序的起始地址 3、…

《北京作家》2010年第2期,总第4期出版

《北京作家》2010年第2期&#xff0c;总第4期出版。 “名家新作”栏目推出的是著名作家张洁的最新短篇小说《一生太长了》&#xff0c;这篇小说最早发表于《人民文学》杂志社&#xff0c;是张洁非常特殊的小说之一。小说以狼为视角&#xff0c;叙述了狼在人类主宰的自然界的生存…

一种数据结构 跳表skiplist

跳表是平衡树的一种替代的数据结构&#xff0c;但是和红黑树不相同的是&#xff0c;跳表对于树的平衡的实现是基于一种随机化的算法的&#xff0c;这样也就是说跳表的插入和删除的工作是比较简单的。 下载地址 : http://download.csdn.net/detail/hemmingway/4625042 测试程…

《曙光与暮色》中的孤独与罪

《你在高原》第八卷《曙光与暮色》的两个主题值得关注。第一是孤独。小说的发展主要有三条线索&#xff1a;宁伽、曲涴、庄周&#xff0c;三条线索虽有内在关联&#xff0c;但都彼此孤立、隔离&#xff0c;甚至是彼此绝缘。小说中人与人之间的关系也是如此&#xff0c;出身、地…

汇编.s文件包含头文件处理

Error[2]: Failed to open #include file ‘FreeRTOSConfig.h’ 解决办法&#xff1a; IAR&#xff0c;在在assembler&#xff08;汇编编译选项&#xff09; 的preprocessor&#xff08;预处理&#xff09;里&#xff0c;填写好 引用的头文件地址

开源代码

我是一个C/C开发者&#xff0c;我收集的代码相关网站也是以C/C为主的&#xff0c;这都是我在开发过程中查找资料时用到或发现的一些网站。现在我把它们列出来&#xff0c;希望对大家有帮助&#xff0c;也希望能够与大家多多交流代码相关的网上资源。所以我在此抛砖了:) 另外声明…

IBM调低DB 2价格,Oracle提高MySQL使用成本

根据The Register公布的一份报告&#xff0c;Oracle取消了MySQL的Basic和Silver级支持。当然&#xff0c;这没有多少损失&#xff0c;在basic级别上&#xff0c;每年只能获得两次支持&#xff0c;而silver级只是增加了一些初级的监控工具。专业人员通常在用生产级数据库中使用的…