Page 1 of 1

Common keyboard shortcuts with WebGadget

Posted: Tue Dec 13, 2011 7:07 am
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

Re: Common keyboard shortcuts with WebGadget

Posted: Tue Dec 13, 2011 7:36 am
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.

Re: Common keyboard shortcuts with WebGadget

Posted: Thu Sep 11, 2014 10:16 am
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

Re: Common keyboard shortcuts with WebGadget

Posted: Thu Sep 11, 2014 7:23 pm
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

Re: Common keyboard shortcuts with WebGadget

Posted: Fri Sep 12, 2014 7:04 am
by Kukulkan
Yes, I'm looking for a solution :-) Thank you very much for this. I will try this.

Best,

Kukulkan

Re: Common keyboard shortcuts with WebGadget

Posted: Fri Sep 12, 2014 4:14 pm
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

Re: Common keyboard shortcuts with WebGadget

Posted: Fri Sep 12, 2014 5:41 pm
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

Re: Common keyboard shortcuts with WebGadget

Posted: Sat Sep 13, 2014 12:31 pm
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