Common keyboard shortcuts with WebGadget

Share your advanced PureBasic knowledge/code with the community.
Mistrel
Addict
Addict
Posts: 3415
Joined: Sat Jun 30, 2007 8:04 pm

Common keyboard shortcuts with WebGadget

Post by Mistrel »

For security reasons by default, keyboard shortcuts are disabled for the Windows WebBrowser Control. Here is an example of how to get them working again.

Source:
http://www.purebasic.fr/english/viewtop ... 13&t=31149

Code: Select all

Enumeration 1
  #OLECMDID_OPEN
  #OLECMDID_NEW
  #OLECMDID_SAVE
  #OLECMDID_SAVEAS
  #OLECMDID_SAVECOPYAS
  #OLECMDID_PRINT
  #OLECMDID_PRINTPREVIEW
  #OLECMDID_PAGESETUP
  #OLECMDID_SPELL
  #OLECMDID_PROPERTIES
  #OLECMDID_CUT
  #OLECMDID_COPY
  #OLECMDID_PASTE
  #OLECMDID_PASTESPECIAL
  #OLECMDID_UNDO
  #OLECMDID_REDO
  #OLECMDID_SELECTALL
  #OLECMDID_CLEARSELECTION
  #OLECMDID_ZOOM
  #OLECMDID_GETZOOMRANGE
  #OLECMDID_UPDATECOMMANDS
  #OLECMDID_REFRESH
  #OLECMDID_STOP
  #OLECMDID_HIDETOOLBARS
  #OLECMDID_SETPROGRESSMAX
  #OLECMDID_SETPROGRESSPOS
  #OLECMDID_SETPROGRESSTEXT
  #OLECMDID_SETTITLE
  #OLECMDID_SETDOWNLOADSTATE
  #OLECMDID_STOPDOWNLOAD
EndEnumeration

Enumeration 0
  #OLECMDEXECOPT_DODEFAULT
  #OLECMDEXECOPT_PROMPTUSER
  #OLECMDEXECOPT_DONTPROMPTUSER
  #OLECMDEXECOPT_SHOWHELP
EndEnumeration

If OpenWindow(0,0,0,600,600,"WebGadget",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  WebGadget(0,20,20,560,560,"http://www.purebasic.com/securedownload/Login.php")
  WebObject.IWebBrowser2=GetWindowLong_(GadgetID(0),#GWL_USERDATA)
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_X,Asc("x"))
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_C,Asc("c"))
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_V,Asc("v"))
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_A,Asc("a"))
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Z,Asc("z"))
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Y,Asc("y"))
  AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Shift|#PB_Shortcut_Z,Asc("y"))
  
  Repeat
    Event=WaitWindowEvent()
    Select Event
      Case #PB_Event_Menu
        Select EventMenu()
          Case Asc("x")
            Debug "cut"
            WebObject\ExecWB(#OLECMDID_CUT,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("c")
            Debug "copy"
            WebObject\ExecWB(#OLECMDID_COPY,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("v")
            Debug "paste"
            WebObject\ExecWB(#OLECMDID_PASTE,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("a")
            Debug "select all"
            WebObject\ExecWB(#OLECMDID_SELECTALL,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("z")
            Debug "undo"
            WebObject\ExecWB(#OLECMDID_UNDO,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("y")
            Debug "redo"
            WebObject\ExecWB(#OLECMDID_REDO,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
      EndSelect
    EndSelect
  Until Event=#WM_CLOSE
EndIf
MachineCode
Addict
Addict
Posts: 1482
Joined: Tue Feb 22, 2011 1:16 pm

Re: Common keyboard shortcuts with WebGadget

Post by MachineCode »

Just a tip: instead of Case Asc("x"), Case Asc("c"), Case Asc("v") and so on, you can just use Case 'x', Case 'c', and Case 'v' and do away with the need for an Asc() conversion totally. Makes the source better to read, too.
Microsoft Visual Basic only lasted 7 short years: 1991 to 1998.
PureBasic: Born in 1998 and still going strong to this very day!
User avatar
Kukulkan
Addict
Addict
Posts: 1396
Joined: Mon Jun 06, 2005 2:35 pm
Location: germany
Contact:

Re: Common keyboard shortcuts with WebGadget

Post by Kukulkan »

Hello,

nice solution. But doesn't this destroy copy&paste functionality for all other gadgets in the window (like StringGadget and EditorGadget)?

Kukulkan
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Common keyboard shortcuts with WebGadget

Post by RASHAD »

Hi Kukulkan
I do not think you are asking for a solution
But just in case

# 1 :

Code: Select all

Enumeration 1
  #OLECMDID_OPEN
  #OLECMDID_NEW
  #OLECMDID_SAVE
  #OLECMDID_SAVEAS
  #OLECMDID_SAVECOPYAS
  #OLECMDID_PRINT
  #OLECMDID_PRINTPREVIEW
  #OLECMDID_PAGESETUP
  #OLECMDID_SPELL
  #OLECMDID_PROPERTIES
  #OLECMDID_CUT
  #OLECMDID_COPY
  #OLECMDID_PASTE
  #OLECMDID_PASTESPECIAL
  #OLECMDID_UNDO
  #OLECMDID_REDO
  #OLECMDID_SELECTALL
  #OLECMDID_CLEARSELECTION
  #OLECMDID_ZOOM
  #OLECMDID_GETZOOMRANGE
  #OLECMDID_UPDATECOMMANDS
  #OLECMDID_REFRESH
  #OLECMDID_STOP
  #OLECMDID_HIDETOOLBARS
  #OLECMDID_SETPROGRESSMAX
  #OLECMDID_SETPROGRESSPOS
  #OLECMDID_SETPROGRESSTEXT
  #OLECMDID_SETTITLE
  #OLECMDID_SETDOWNLOADSTATE
  #OLECMDID_STOPDOWNLOAD
EndEnumeration

Enumeration 0
  #OLECMDEXECOPT_DODEFAULT
  #OLECMDEXECOPT_PROMPTUSER
  #OLECMDEXECOPT_DONTPROMPTUSER
  #OLECMDEXECOPT_SHOWHELP
EndEnumeration

If OpenWindow(0,0,0,820,600,"WebGadget",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  WebGadget(0,10,10,400,560,"http://www.purebasic.com/securedownload/Login.php")
  WebObject.IWebBrowser2=GetWindowLongPtr_(GadgetID(0),#GWL_USERDATA)
  EditorGadget(1,420,10,390,560)

Repeat
    Event=WaitWindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
              Quit = 1
              
      Case #PB_Event_Gadget
             Select EventGadget()
                  Case 0
                            AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_X,Asc("x"))
                            AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_C,Asc("c"))
                            AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_V,Asc("v"))
                            AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_A,Asc("a"))
                            AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Z,Asc("z"))
                            AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Y,Asc("y"))
                            AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_Shift|#PB_Shortcut_Z,Asc("y"))
                  Case 1
                           RemoveKeyboardShortcut(0, #PB_Shortcut_All)                           
             EndSelect      
      
      Case #PB_Event_Menu
        Select EventMenu()
          Case Asc("x")
            Debug "cut"
            WebObject\ExecWB(#OLECMDID_CUT,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("c")
            Debug "copy"
            WebObject\ExecWB(#OLECMDID_COPY,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("v")
            Debug "paste"
            WebObject\ExecWB(#OLECMDID_PASTE,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("a")
            Debug "select all"
            WebObject\ExecWB(#OLECMDID_SELECTALL,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("z")
            Debug "undo"
            WebObject\ExecWB(#OLECMDID_UNDO,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
          Case Asc("y")
            Debug "redo"
            WebObject\ExecWB(#OLECMDID_REDO,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
      EndSelect
    EndSelect
  Until  Quit = 1
EndIf

# 2 :
To avoid EventWparam() you can use CallBack

Code: Select all

Enumeration 1
  #OLECMDID_OPEN
  #OLECMDID_NEW
  #OLECMDID_SAVE
  #OLECMDID_SAVEAS
  #OLECMDID_SAVECOPYAS
  #OLECMDID_PRINT
  #OLECMDID_PRINTPREVIEW
  #OLECMDID_PAGESETUP
  #OLECMDID_SPELL
  #OLECMDID_PROPERTIES
  #OLECMDID_CUT
  #OLECMDID_COPY
  #OLECMDID_PASTE
  #OLECMDID_PASTESPECIAL
  #OLECMDID_UNDO
  #OLECMDID_REDO
  #OLECMDID_SELECTALL
  #OLECMDID_CLEARSELECTION
  #OLECMDID_ZOOM
  #OLECMDID_GETZOOMRANGE
  #OLECMDID_UPDATECOMMANDS
  #OLECMDID_REFRESH
  #OLECMDID_STOP
  #OLECMDID_HIDETOOLBARS
  #OLECMDID_SETPROGRESSMAX
  #OLECMDID_SETPROGRESSPOS
  #OLECMDID_SETPROGRESSTEXT
  #OLECMDID_SETTITLE
  #OLECMDID_SETDOWNLOADSTATE
  #OLECMDID_STOPDOWNLOAD
EndEnumeration

Enumeration 0
  #OLECMDEXECOPT_DODEFAULT
  #OLECMDEXECOPT_PROMPTUSER
  #OLECMDEXECOPT_DONTPROMPTUSER
  #OLECMDEXECOPT_SHOWHELP
EndEnumeration

If OpenWindow(0,0,0,820,600,"WebGadget",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  WebGadget(0,10,10,400,560,"http://www.purebasic.com/securedownload/Login.php")
  WebObject.IWebBrowser2=GetWindowLongPtr_(GadgetID(0),#GWL_USERDATA)
  EditorGadget(1,420,10,390,560)

Repeat
    Event=WaitWindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
              Quit = 1
              
      Case #WM_CHAR
              If GetActiveGadget() = 0
                     If EventwParam() = 24
                        Debug "cut"
                        WebObject\ExecWB(#OLECMDID_CUT,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
                      ElseIf EventwParam() = 3
                        Debug "copy"
                        WebObject\ExecWB(#OLECMDID_COPY,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
                      ElseIf EventwParam() = 22
                        Debug "paste"
                        WebObject\ExecWB(#OLECMDID_PASTE,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
                      ElseIf EventwParam() = 1
                        Debug "select all"
                        WebObject\ExecWB(#OLECMDID_SELECTALL,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
                      ElseIf EventwParam() = 26
                        Debug "undo"
                        WebObject\ExecWB(#OLECMDID_UNDO,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
                      ElseIf EventwParam() = 25
                        Debug "redo"
                        WebObject\ExecWB(#OLECMDID_REDO,#OLECMDEXECOPT_DONTPROMPTUSER,0,0)
                      EndIf 
              EndIf            
 
    EndSelect
  Until  Quit = 1
EndIf
Egypt my love
User avatar
Kukulkan
Addict
Addict
Posts: 1396
Joined: Mon Jun 06, 2005 2:35 pm
Location: germany
Contact:

Re: Common keyboard shortcuts with WebGadget

Post by Kukulkan »

Yes, I'm looking for a solution :-) Thank you very much for this. I will try this.

Best,

Kukulkan
User avatar
Kukulkan
Addict
Addict
Posts: 1396
Joined: Mon Jun 06, 2005 2:35 pm
Location: germany
Contact:

Re: Common keyboard shortcuts with WebGadget

Post by Kukulkan »

Hm, it does not work reliable as the WebGadget only fires events in the beginning. If the content is displayed, it only fires event type 2 (#PB_EventType_LeftDoubleClick And #PB_EventType_StatusChange). It does not fire for getting and losing focus. Thus, I can not reliable determine the status (focus is inside or not) using such events :-( I also do not like to add a handler for every gadget just to make sure if someone of them is having the focus...

Am I wrong with this test?

Code: Select all

If OpenWindow(0, 0, 0, 800, 600, "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  WebGadget(0, 10, 10, 780, 300, "")
  ButtonGadget(1, 10, 320, 780, 30, "Button")
  StringGadget(2, 10, 370, 780, 30, "Text field")
  ButtonGadget(3, 10, 420, 780, 30, "Button")
 
  html.s = "<html><body>"+
           "<textarea id='editor'></textarea><br>"+
           "</body></html>"
 
  SetGadgetItemText(0, #PB_Web_HtmlCode, html.s)
 
  While WaitWindowEvent() <> #PB_Event_CloseWindow
    If EventGadget() = 0 ; WebGadget fired something
      et.i = EventType()
      If et.i <> -1
        Debug "Webgadget fired EventType: " + Str(et.i)
      EndIf
    EndIf
  Wend
 
EndIf
Kukulkan
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: Common keyboard shortcuts with WebGadget

Post by RASHAD »

Hi

Code: Select all

Procedure IsMouseOver(hWnd) 
    GetWindowRect_(hWnd,r.RECT) 
    GetCursorPos_(p.POINT) 
    Result = PtInRect_(r,p\y << 32 + p\x) 
    ProcedureReturn Result 
EndProcedure

If OpenWindow(0, 0, 0, 800, 600, "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  WebGadget(0, 10, 10, 780, 300, "")
 
  ButtonGadget(1, 10, 320, 780, 30, "Button")
  StringGadget(2, 10, 370, 780, 30, "Text field")
  SetWindowPos_(GadgetID(2), #HWND_TOPMOST, 0, 0, 0, 0,#SWP_NOSIZE|#SWP_NOMOVE)
  ButtonGadget(3, 10, 420, 780, 30, "Button")
 
  html.s = "<html><body>"+
           "<textarea id='editor'></textarea><br>"+
           "</body></html>"
 
  SetGadgetItemText(0, #PB_Web_HtmlCode, html.s) 
 
 Repeat
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
               Quit = 1
               
        Case #PB_Event_Gadget
            Select EventGadget()
                Case 0                  
                     
            EndSelect
            
        Case #WM_LBUTTONDOWN 
                If IsMouseOver(GadgetID(0)) And run = 0
                       run = 1
                       hWnd = GetFocus_()
                EndIf
                If GetFocus_() = hWnd
                    Debug "Got Focus"
                Else 
                    Debug "Lost Focus"
                EndIf
                
        Case #WM_MOUSEMOVE
                If IsMouseOver(GadgetID(0))
                    Debug "Over"
                Else
                    Debug "Out"
                EndIf            

EndSelect
Until Quit = 1 
EndIf
Egypt my love
User avatar
Kukulkan
Addict
Addict
Posts: 1396
Joined: Mon Jun 06, 2005 2:35 pm
Location: germany
Contact:

Re: Common keyboard shortcuts with WebGadget

Post by Kukulkan »

Thanks for this.

But if I enter using TAB it does not work. And also, the mouse is not always over the gadget I'm working in.

I try to combine this into some workaround. Hopefully for Mac I don't need such. Have to test this on Monday. The whole code now looking like a mess because of all the CompilerIf etc. Need to encapsulate this later...

Thanks for the support!

Kukulkan
Post Reply