/**************************************************************************************************************** Simple example how to inhibit special windows keys in our programs. Traduced from the article: http://msdn.microsoft.com/msdnmag/issues/0700/win32/ This code only works in Win NT, Win 2000 and so on. It doesn't work in Windows 98 ****************************************************************************************************************/ /* Some needed defines */ DEFINE LLKHF_ALTDOWN = 0x20 DEFINE WH_KEYBOARD_LL = 13 STRUCT KBDLLHOOKSTRUCT ALIGN 1 MEMBER vkCode AS DWORD MEMBER scanCode AS DWORD MEMBER flags AS DWORD MEMBER time AS DWORD MEMBER dwExtraInfo AS DWORD /* Function hooking the special keys */ FUNCTION LowLevelKeyboardProc(nCode AS INT,wParam AS DWORD,lParam AS DWORD) AS LONG // By returning a non-zero value from the hook procedure, the // message does not get passed to the target window LOCAL pkbhs AS KBDLLHOOKSTRUCT LOCAL bControlKeyDown := FALSE AS LOGIC LOCAL tcontrol AS DWORD IF nCode == HC_ACTION IF wParam = WM_KEYDOWN .or. wParam = WM_SYSKEYDOWN .OR. wParam = WM_KEYUP .OR.; wParam = WM_SYSKEYUP pkbhs := PTR(_CAST, lParam) tcontrol := GetKeyState(VK_CONTROL) bControlKeyDown := (pkbhs.vkCode = VK_TAB .AND. _And(pkbhs.flags,LLKHF_ALTDOWN)!= 0 ) .OR.; (pkbhs.vkCode = VK_ESCAPE .AND. _And(pkbhs.flags,LLKHF_ALTDOWN)!= 0 ) .OR. ; (pkbhs.vkCode = VK_ESCAPE .AND. _And(tcontrol,0x8000) != 0) .OR.; (pkbhs.vkCode = VK_LWIN) .OR.; (pkbhs.vkCode = VK_RWIN) IF bControlKeyDown RETURN 1 ENDIF ENDIF ENDIF RETURN CallNextHookEx (NULL, nCode, wParam, lParam) METHOD Start() CLASS App LOCAL oWindow AS StandardSDIWindow // Install the low-level keyboard & mouse hooks LOCAL ptrfunc AS PTR // ptr to function LOCAL hhkLowLevelKybd AS PTR // ptr to the hook thread // install the function thread ptrfunc := @LowLevelKeyboardProc() hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, ptrfunc, SELF:Handle(), 0) oWindow := StandardSDIWindow{SELF} oWindow:Caption := "Example Hook" // Make shell size same as data window oWindow:Size := Dimension{595, 425} oWindow:Show(SHOWNORMAL) SELF:Exec() /* Here we have to free the resources */ METHOD QueryClose(oE) SUPER:QueryClose(oE) // free the resources (and the special keys) UnHookWindowsHookEx(hhkLowLevelKybd) RETURN TRUE