#define VK_LSHIFT 0xA0 && Left SHIFT #define VK_RSHIFT 0xA1 && Right SHIFT #define VK_LCONTROL 0xA2 && Left CONTROL #define VK_RCONTROL 0xA3 && Right CONTROL #define VK_LMENU 0xA4 && Left ALT #define VK_RMENU 0xA5 && Right ALT DECLARE SHORT GetAsyncKeyState IN USER32.DLL INTEGER nVKey && Virtual key-code * Repeatedly show the key states DO WHILE .T. * Only update every 1/10th second lnStart = SECONDS() + 0.10 DO WHILE SECONDS() < lnStart ENDDO * Get the key press states llShiftL = (BITAND(GetAsyncKeyState(VK_LSHIFT), 0x8000) != 0) llShiftR = (BITAND(GetAsyncKeyState(VK_RSHIFT), 0x8000) != 0) llCtrlL = (BITAND(GetAsyncKeyState(VK_LCONTROL), 0x8000) != 0) llCtrlR = (BITAND(GetAsyncKeyState(VK_RCONTROL), 0x8000) != 0) llAltL = (BITAND(GetAsyncKeyState(VK_LMENU), 0x8000) != 0) llAltR = (BITAND(GetAsyncKeyState(VK_RMENU), 0x8000) != 0) WAIT WINDOW "Keys: " + ; IIF(llShiftL, "Left Shift ", SPACE(0)) + ; IIF(llShiftR, "Right Shift ", SPACE(0)) + ; IIF(llCtrlL, "Left Control ", SPACE(0)) + ; IIF(llCtrlR, "Right Control ", SPACE(0)) + ; IIF(llAltL, "Left Alt ", SPACE(0)) + ; IIF(llAltR, "Right Alt ", SPACE(0)) NOWAIT IF llShiftL AND llShiftR AND llCtrlL AND llCtrlR AND llAltL AND llAltR * When all keys are pressed, exit EXIT ENDIF ENDDO CANCEL>>If you do this as the first operation of your click() event, the shift key will likely still be down so the return value will be valid in that case (if you can't check it any other way).