Modal Window Workaround(Win XP-Vista-7)

Share your advanced PureBasic knowledge/code with the community.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Modal Window Workaround(Win XP-Vista-7)

Post by RASHAD »

More work to do
Tested on Win XP x86,Win 7 x64

Code: Select all

Structure KBDLLHOOKSTRUCT
    vkCode.i
    scanCode.i
    flags.i
    time.i
    dwExtraInfo.i
EndStructure

Procedure KeyboardHook(iCode, wParam, lParam)
Protected *key.KBDLLHOOKSTRUCT = lparam

If (iCode < 0 Or iCode <> #HC_ACTION)  
    ProcedureReturn CallNextHookEx_(Hook, iCode, wParam, lParam)
EndIf

If wParam = #WM_KEYDOWN Or wParam = #WM_KEYUP
      If *key\vkCode = #VK_LWIN Or *key\vkCode = #VK_RWIN
        ProcedureReturn 1
      EndIf
EndIf

ProcedureReturn CallNextHookEx_(Hook, iCode, wParam, lParam)
EndProcedure

ExamineDesktops()
OpenWindow(0,0,0,DesktopWidth(0),DesktopHeight(0),"",#PB_Window_BorderLess)
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE,#WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(0),0,1,#LWA_ALPHA)
OpenWindow(1,0,0,400,300,"Modal Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StringGadget(2,10,10, 200,24,"",#ES_CENTER)
ButtonGadget(3,10,270,80,22,"Exit")
Hook = SetWindowsHookEx_(#WH_KEYBOARD_LL, @KeyboardHook(), GetModuleHandle_(#Null), 0)

Repeat
  If GetActiveWindow() <> 1
    SetActiveWindow(1)
  EndIf
  Select WaitWindowEvent()
      
    Case #PB_Event_CloseWindow
        UnhookWindowsHookEx_(Hook)
        Q = 1
       
      Case #PB_Event_Gadget
          Select EventGadget()
            Case 2
              
            Case 3
              UnhookWindowsHookEx_(Hook)
              Q = 1
              
          EndSelect
  EndSelect 
Until Q =1

Egypt my love
User avatar
chi
Addict
Addict
Posts: 1087
Joined: Sat May 05, 2007 5:31 pm
Location: Austria

Re: Modal Window Workaround(Win XP-Vista-7)

Post by chi »

nice one, thanks!
Et cetera is my worst enemy
Mistrel
Addict
Addict
Posts: 3415
Joined: Sat Jun 30, 2007 8:04 pm

Re: Modal Window Workaround(Win XP-Vista-7)

Post by Mistrel »

My attempt to kill the program with the big red "Kill Program" button on the IDE failed miserably! :shock:

I don't know what you would use this for but it certainly works.
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

Re: Modal Window Workaround(Win XP-Vista-7)

Post by cas »

I just press Alt+Tab to switch to PB IDE and then i can close it. Or Open Task Manager and switch to PB IDE from there...
But, if any application would block other windows like this code does, i would delete it immediately from my computer. There are other ways (non-abusable) to get attention from user to input data.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Modal Window Workaround(Win XP-Vista-7)

Post by RASHAD »

Hi chi
Hi Mistrel

@cas Hi
Alt-Tab and the task manager that is why I wrote "More work to do"
But I will not go any further it does not worth it
I do not like to leave something behind so you can consider it how to skin Win XP
as long as #LWA_COLORKEY did not work with that OS
Egypt my love
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Modal Window Workaround(Win XP-Vista-7)

Post by Kwai chang caine »

cas wrote:But, if any application would block other windows like this code does, i would delete it immediately from my computer
No CAS sometime that can be very useful....if you want know why...see my link :roll:

@RASHAD
Yeeeaaahhh !!! RASHAD !!!! :D

A window like i need.....
http://www.purebasic.fr/english/viewtop ... 80#p336780
But this time...no "malicious" screenshot :lol: :lol:

You are too strong...you have add a function that MICROSOFT hitself don't want to do, like SROD have proof it's impossible, when he found this link for me 8)
http://support.microsoft.com/kb/147817
Microsoft wrote:NOTE: An equivalent Win32 API function for SetSysModalWindow does not exist. System modal windows contradict the concept of multitasking and thus are not implemented in Win32.
Well you have proved your turn, that impossible is not RASHAD :mrgreen:

Thanks a lot for sharing this code 8)
Have a good day
ImageThe happiness is a road...
Not a destination
User avatar
p2hicy
User
User
Posts: 11
Joined: Fri Apr 25, 2003 5:31 pm
Location: Iceland
Contact:

Re: Modal Window Workaround(Win XP-Vista-7)

Post by p2hicy »

That only works on the primary screen. On my 3 monitor setup, I'm still able to use the other two.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Modal Window Workaround(Win XP-Vista-7)

Post by RASHAD »

- Alt-Tab blocked
- Task-Manager switching blocked
- And may be Multi-Monitors as well

Updated :
- Alt-Esc blocked
- Ctrl-Esc blocked
- May be Winamp as well

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 (iCode < 0 Or iCode <> #HC_ACTION)  
      ProcedureReturn CallNextHookEx_(Hook, iCode, wParam, lParam)
    EndIf
    
  If Not PtInRect_(@r,PeekQ(@p))  
    If wParam=#WM_LBUTTONDOWN Or wParam=#WM_LBUTTONDBLCLK
      ;#WM_RBUTTONDOWN,#WM_RBUTTONUP,#WM_RBUTTONDBLCLK,#WM_MBUTTONDOWN,#WM_MBUTTONDBLCLK
      ProcedureReturn 1
    EndIf
  EndIf      

  If wParam = #WM_KEYDOWN Or wParam = #WM_KEYUP
    If *key\vkCode = #VK_LWIN Or *key\vkCode = #VK_RWIN Or *key\vkCode = #VK_LCONTROL Or *key\vkCode = #VK_RCONTROL
      ProcedureReturn 1
    Else
      ProcedureReturn 0
    EndIf
  EndIf
  
  If  (*key\vkCode ! #VK_MENU And *key\vkCode = #VK_TAB ) Or (*key\vkCode ! #VK_MENU And *key\vkCode = #VK_ESCAPE)
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf  
 
   ProcedureReturn CallNextHookEx_(0,nCode,wParam,lParam)   
EndProcedure

ExamineDesktops()
OpenWindow(0,0,0,DesktopWidth(0),DesktopHeight(0),"",#PB_Window_BorderLess)
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE,#WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(0),0,1,#LWA_ALPHA)
SetForegroundWindow_(WindowID(0))
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
  GetCursorPos_(@p.point)
  GetWindowRect_(WindowID(1),r.RECT)
  If GetActiveWindow() <> 1
    SetActiveWindow(1)
  EndIf
  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)


Last edited by RASHAD on Tue Oct 26, 2010 3:15 am, edited 1 time in total.
Egypt my love
rsts
Addict
Addict
Posts: 2736
Joined: Wed Aug 24, 2005 8:39 am
Location: Southwest OH - USA

Re: Modal Window Workaround(Win XP-Vista-7)

Post by rsts »

Pretty close.

For some reason, winamp will still respond. Nothing else seems to, but if winamp is running (and is a front window) it still responds to mouse clicks.

Nice one.

cheers
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: Modal Window Workaround(Win XP-Vista-7)

Post by netmaestro »

Winamp will be using a lowlevel mouse hook that gets processed before this hook does.
BERESHEIT
User avatar
Alireza
Enthusiast
Enthusiast
Posts: 143
Joined: Sat Aug 16, 2008 2:02 pm
Location: Iran

Re: Modal Window Workaround(Win XP-Vista-7)

Post by Alireza »

Good Cod, Thanks :D
maybe u can add Ctrl-esc for more performance . 8)
PB v 5.6 :D
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: Modal Window Workaround(Win XP-Vista-7)

Post by RASHAD »

Previous Post just updated
- Alt-Esc blocked
- Ctrl-Esc blocked

@rsts
Please report your config for Winamp(see if winamp still in front or not)
Or if it is as 'netmaestro' stated
Egypt my love
User avatar
Alireza
Enthusiast
Enthusiast
Posts: 143
Joined: Sat Aug 16, 2008 2:02 pm
Location: Iran

Re: Modal Window Workaround(Win XP-Vista-7)

Post by Alireza »

Thanks dear Rashad :D
PB v 5.6 :D
kvitaliy
Enthusiast
Enthusiast
Posts: 162
Joined: Mon May 10, 2010 4:02 pm

Re: Modal Window Workaround(Win XP-Vista-7)

Post by kvitaliy »

Combination Ctrl + Alt + Del ?
rsts
Addict
Addict
Posts: 2736
Joined: Wed Aug 24, 2005 8:39 am
Location: Southwest OH - USA

Re: Modal Window Workaround(Win XP-Vista-7)

Post by rsts »

RASHAD wrote:
@rsts
Please report your config for Winamp(see if winamp still in front or not)
Or if it is as 'netmaestro' stated
Mr Rashad,

My bad. I run a multiple monitor setup. Winamp was on another monitor. :oops:

All is blocked when on the same screen.

cheers
Post Reply