Code has been revised
Optimized and it is now in good shape
Code: Select all
Structure KBDLLHOOKSTRUCT
vkCode.l
scanCode.l
flags.l
time.l
dwExtraInfo.l
EndStructure
Global r.RECT,p.POINT
Procedure HookMK(nCode,wParam,lParam)
*key.KBDLLHOOKSTRUCT = lparam
If wParam=#WM_LBUTTONDOWN Or wParam=#WM_LBUTTONUP Or wParam=#WM_LBUTTONDBLCLK Or wParam=#WM_RBUTTONDOWN Or wParam=#WM_RBUTTONUP Or wParam=#WM_RBUTTONDBLCLK
If Not PtInRect_(@r,PeekQ(@p))
ProcedureReturn 1
EndIf
EndIf
If *key\vkCode = #VK_LWIN Or *key\vkCode = #VK_RWIN Or *key\vkCode = #VK_LCONTROL Or *key\vkCode = #VK_RCONTROL Or (*key\vkCode ! #VK_MENU And *key\vkCode = #VK_TAB ) Or (*key\vkCode ! #VK_MENU And *key\vkCode = #VK_ESCAPE)
ProcedureReturn 1
EndIf
ProcedureReturn CallNextHookEx_(0,nCode,wParam,lParam)
EndProcedure
OpenWindow(1,0,0,400,300,"Modal Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StickyWindow(1,1)
StringGadget(2,10,10, 200,24,"",#ES_CENTER)
ButtonGadget(3,10,270,80,22,"Exit")
MouseHook = SetWindowsHookEx_(#WH_MOUSE_LL,@HookMK(),GetModuleHandle_(0),0)
KeyHook = SetWindowsHookEx_(#WH_KEYBOARD_LL,@HookMK(),GetModuleHandle_(0),0)
Repeat
SetForegroundWindow_(WindowID(1))
GetCursorPos_(@p.point)
GetWindowRect_(WindowID(1),r.RECT)
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Q = 1
Case #PB_Event_Gadget
Select EventGadget()
Case 2
Case 3
Q = 1
EndSelect
EndSelect
Until Q =1
UnhookWindowsHookEx_(MouseHook)
UnhookWindowsHookEx_(KeyHook)