A solução é chamada AutoHotkey e um tutorial para iniciantes pode ser encontrado aqui .
Este é o meu script:
#Persistent
SetTimer, Main, 1
return
Main:
if (GetKeyState("Up", "P"))
MouseMove, 0, -25, 0, R
if (GetKeyState("Down", "P") or GetKeyState("NumpadClear", "P"))
MouseMove, 0, 25, 0, R
if (GetKeyState("Right", "P"))
MouseMove, 50, 0, 0, R
if (GetKeyState("Left", "P"))
MouseMove, -50, 0, 0, R
return
NumpadClear é a tecla numérica do meio, então isso permite usar um padrão WASD no teclado numérico (8456).