I have realized that this function as microsoft documents, returns a short. I have being using this function as such before :redface::
push VK_LEFT
call GetAsyncKeyState
test eax,80000000h
jnz go_to_left ; Left key pressed.
And worked fine :shock:. So i'm guessing that microsoft win api internally code something like:
push VK_LEFT
call GetAsyncKeyState
movsx eax,ax
test eax,80000000h
jnz go_to_left ; Left key pressed.
Also i have found in the windows.inc that the typedef for SHORT it's commented. It's because can have any conflict with other type? Or is just better to only typedef USHORT? Well, i will not use any of this typedef anyway, is just curiosity. :idea:
Well, Olly have told me that in fact it's implemented at some point as:
movsx eax,al
Well, at least for a console program (not using unicode). So, i think it will be much safer to do this in my code:
movsx eax,ax
As the microsoft documentation about the function states (returns a short). Is the safer approach, we don't know when it will change the code for the internally implementation of the win api.
include \masm32\include\masm32rt.inc
.code
start:
print "Press Ctrl C to exit", 13, 10, 10
.While 1
invoke Sleep, 1
invoke GetAsyncKeyState, VK_SHIFT
test ah, ah
.if Sign?
print "Shift is pressed ", 13
.else
print "Shift not pressed", 13
.endif
.Endw
end start
If Microsoft says it returns a short it means that it returns a short - period, in other words anything after the 16 bits is not part of the official solution, although may work for some versions of windows, eventually for all versions of windows. Confused? :lol:
However, the 16-bit (the short part) has the obligation to always work as per the specification.
:biggrin:
Has worked well for many years.
IfRepeatKey MACRO vk_key
invoke GetAsyncKeyState,vk_key
and eax, 00000000000000001000000000000000b
rol eax, 17
cmp eax, 1
ENDM