********** >>* In form's Init() event: >>***** >> DECLARE SHORT GetAsyncKeyState IN USER32 INTEGER nVKey >> >> #define WM_KEYDOWN 0x0100 >> #define WM_KEYUP 0x0101 >> BINDEVENT(thisForm.hwnd, WM_KEYDOWN, thisForm, "onWindowsLevelKeyPress") >> BINDEVENT(thisForm.hwnd, WM_KEYUP, thisForm, "onWindowsLevelKeyPress") >> >> >>********** >>* Then in onWindowsLevelKeyPress() >>***** >> LPARAMETERS tnHwnd, tnMsg, tnW, tnL >> >> #define VK_LSHIFT 0xa0 >> #define VK_RSHIFT 0xa1 >> *#define VK_LCONTROL 0xa2 >> *#define VK_RCONTROL 0xa3 >> *#define VK_LMENU 0xa4 >> *#define VK_RMENU 0xa5 >> >> >> ********** >> * Check the condition >> ***** >> DO CASE >> CASE BITAND(GetAsyncKeyState(VK_RSHIFT), 0x8000) != 0 >> * Right shift is down >> >> CASE BITAND(GetAsyncKeyState(VK_LSHIFT), 0x8000) != 0 >> * Left shift is down >> >> OTHERWISE >> * Neither shift key is down >> >> ENDCASE >>>In your .Init code the two DEFINEs are the same - shouldn't one of them be WM_KEYUP?