Das ist nicht DirectInput sondern
Win32. GetKeyboardLayout(0) sollte nicht noetig sein, denn MapVirtualKey benutzt das aktuelle Layout das du ja abrufst.
Warum nimmst du nicht GetKeyState(VK_CAPSLOCK)? Das ist uebrigens der CapsLock-Status und nicht der Shift-Status.
Am besten funktioniert ToAscii fuer dich.
VkKeyScan darf nicht vergessen werden, da der CapsLock-Status je nach Tastaturlayout unterschiedliche Bedeutung hat.
Bei dem normalen deutschen Layout ist es ein ShiftLock, waehrend "Deutsch (IBM)" ein CapsLock implementiert.
Der Unterschied liegt in der Zeile der Zifferntasten. ShiftLock ergibt bei "1" ddas Zeichen "!" waehrend CapsLock "1" ergibt.