Der
ASCII-Wert ist irrelevant, er braucht den virtuellen Tastencode, und das ist Ord('S')=83.
Der
ASCII-Wert wird erst später gebildet.
BTW: Bei mir wechselt Windows nicht bei ALT zu, sondern bei ALT+TAB.
Achja und übrigens: Wenn das höchste Bit gesetzt ist, dann ist das Ergebnis von GetAsyncKeyState IMMER <0, daher ist das schon richtig.