Faptul ca e cross-platform e destul de irelevant avind in vedere ca pe platformele alea pe care le cistigi pe linga Windows nu se joaca nimeni.
Apropo de citeva linii pentru initializat DirectInput: DirectInput nu merita folosit pentru tastatura si mouse. E bun doar pentru joystick-uri, volane, pad-uri etc. (dar nu pentru pad-ul de 360). Cum se face treaba:
Tastatura: WM_KEYDOWN, WM_KEYUP.
Mouse:
1) WM_MOUSEMOVE & friends e o varianta, dar atentie, mesajele astea se trimit dupa ce se aplica
pointer ballistics. Pe scurt asta inseamna ca distanta parcursa de cursor nu e o functie liniara a distantei parcurse de mouse pe pad. Asta e un lucru foarte bun pentru pointer in UI, dar nu e optim pentru unii playeri atunci cind controlezi camera cu mouse-ul (in FPS-uri, de exemplu). FPS-urile au in general un model propriu de acceleratie pentru mouse, dar e destul de ciudat sa-l aplici unor date care deja sint accelerate.
2)
RawInput (WM_INPUT), care-ti da mesajele asa cum vin, fara sa aplice ballistics. Aparent exista dezavantajul ca trebuie sa implementezi tu ballistics pentru UI in joc (5 linii de cod), dar cum ziceam mai sus ai nevoie de un model de acceleratie si pentru tintit, deci codul ala se scrie oricum. Pentru placerea maxima probabil trebuie folosite alte curbe in UI decit in joc, dar sint 2 constante (sau 6, daca esti fancy). RawInput mai are si avantajul ca poti suporta mai multi mousi, daca jocul are nevoie de asa ceva. Utilizarea e banala, cum se vede aici:
http://msdn.microsoft.com/en-us/library/bb206183 (VS.85).aspx#WM_INPUT (URL-ul nu merge din motive de parser varza in forum). De la XP incoace DirectInput e doar un wrapper peste RawInput.
Joystick-uri si pad-uri (in afara de controller-ul de 360): DirectInput.
Pad-ul de 360: XInput. Se poate folosi si cu DirectInput, dar triggerele apar ca o singura axa (adica unul e mapat pe jumatatea negativa si celalalt pe jumatatea pozitiva). Daca vrei sa-l folosesti, de exemplu, pentru un joc cu masini si sa pui frina si acceleratia pe triggere, limitarea asta e destul de nasoala (exista si unele volane care mapeaza pedalele asa, si nu poti sa te joci decit arcade-uri cu ele). Alte chestii care nu merg cu DInput sint vibratia si headset-ul. Ca fapt divers, XInput are si el o mare timpenie, si anume XInputGetState() dureaza miliarde de ani daca ceri un controller neconectat. Daca vrei sa-l folosesti pentru a te prinde cind user-ul conecteaza un nou controller in timpul jocului, trebuie sa muti input-ul intr-un thread separat si sa bagi mesaje async intr-o coada in thread-ul care le proceseaza, si chiar si atunci trebuie sa verifici daca s-au bagat controllere noi doar din cind in cind, nu in fiecare frame.