WebViewGadget: Disable Printing?

Just starting out? Need help? Post your questions and find answers here.
wayne-c
Enthusiast
Enthusiast
Posts: 337
Joined: Tue Jun 08, 2004 10:29 am
Location: Zurich, Switzerland

WebViewGadget: Disable Printing?

Post by wayne-c »

Is there a possibility to disable the printing feature (CTRL+P) in the new WebViewGadget?
As you walk on by, Will you call my name? Or will you walk away?
breeze4me
Enthusiast
Enthusiast
Posts: 633
Joined: Thu Mar 09, 2006 9:24 am
Location: S. Kor

Re: WebViewGadget: Disable Printing?

Post by breeze4me »

You can handle a shortcut key input in the webview gadget as shown below.

Code: Select all

;----------------------------------------------------------------------------------------
; https://learn.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2acceleratorkeypressedeventhandler?view=webview2-1.0.2903.40
; https://learn.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2acceleratorkeypressedeventargs?view=webview2-1.0.2903.40

DataSection
  IID_IUnknown:
  Data.l $00000000
  Data.w $0000, $0000
  Data.b $C0, $00, $00, $00, $00, $00, $00, $46
EndDataSection

Structure _IUnknownBase
  *pVtbl
  *pQueryInterface
  *pAddRef
  *pRelease
  *pInvoke
  
  lRefCount.l
  Token.q
EndStructure

Procedure.l ICoreWebView2AcceleratorKeyPressedEventHandler_QueryInterface(*this._IUnknownBase, *riid.IID, *ppvObject.Integer)
  If *ppvObject And *riid
    If CompareMemory(*riid, ?IID_IUnknown, SizeOf(IID))
      *this\lRefCount + 1
      *ppvObject\i = *this
    Else
      *ppvObject\i = 0
      ProcedureReturn #E_NOINTERFACE
    EndIf
  Else
    ProcedureReturn #E_POINTER
  EndIf
  ProcedureReturn #S_OK
EndProcedure

Procedure.l ICoreWebView2AcceleratorKeyPressedEventHandler_AddRef(*this._IUnknownBase)
  *this\lRefCount + 1
  ProcedureReturn *this\lRefCount
EndProcedure

Procedure.l ICoreWebView2AcceleratorKeyPressedEventHandler_Release(*this._IUnknownBase)
  *this\lRefCount - 1
  
  If *this\lRefCount <= 0
    FreeMemory(*this)
    ProcedureReturn 0
  EndIf
  
  ProcedureReturn *this\lRefCount
EndProcedure

Procedure.l ICoreWebView2AcceleratorKeyPressedEventHandler_Invoke(*this._IUnknownBase, *sender.ICoreWebView2Controller, *args.ICoreWebView2AcceleratorKeyPressedEventArgs)
  Protected EventKind, VKey.l
  
  If *args And *args\get_KeyEventKind(@EventKind) = #S_OK
    If EventKind = #COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN
      If *args\get_VirtualKey(@VKey) = #S_OK And VKey = #VK_P
        *args\put_Handled(#True)
      EndIf
    EndIf
  EndIf
  
  ProcedureReturn #S_OK
EndProcedure

Procedure SetAcceleratorKeyPressedEvent(WebView)
  Protected Result
  Protected Controller.ICoreWebView2Controller
  Protected *ICoreWebView2AcceleratorKeyPressedEventHandler._IUnknownBase
  Protected Token.q
  
  If GadgetType(WebView) <> #PB_GadgetType_WebView : ProcedureReturn 0 : EndIf
  
  Controller = GetGadgetAttribute(WebView, #PB_WebView_ICoreController)
  If Controller = 0 : ProcedureReturn 0 : EndIf
  
  *ICoreWebView2AcceleratorKeyPressedEventHandler = AllocateMemory(SizeOf(_IUnknownBase))
  If *ICoreWebView2AcceleratorKeyPressedEventHandler = 0 : Goto Proc_Exit : EndIf
  
  With *ICoreWebView2AcceleratorKeyPressedEventHandler
    \pVtbl = *ICoreWebView2AcceleratorKeyPressedEventHandler + OffsetOf(_IUnknownBase\pQueryInterface)
    \pQueryInterface = @ICoreWebView2AcceleratorKeyPressedEventHandler_QueryInterface()
    \pAddRef         = @ICoreWebView2AcceleratorKeyPressedEventHandler_AddRef()
    \pRelease        = @ICoreWebView2AcceleratorKeyPressedEventHandler_Release()
    \pInvoke         = @ICoreWebView2AcceleratorKeyPressedEventHandler_Invoke()
  EndWith
  
  If Controller\add_AcceleratorKeyPressed(*ICoreWebView2AcceleratorKeyPressedEventHandler, @Token) <> #S_OK : Goto Proc_Exit : EndIf
  *ICoreWebView2AcceleratorKeyPressedEventHandler\Token = Token
  
  Result = 1
  
  Proc_Exit:
  If Result = 0
    If *ICoreWebView2AcceleratorKeyPressedEventHandler
      If *ICoreWebView2AcceleratorKeyPressedEventHandler\Token And Controller
        Controller\remove_AcceleratorKeyPressed(*ICoreWebView2AcceleratorKeyPressedEventHandler\Token)
      EndIf
      FreeMemory(*ICoreWebView2AcceleratorKeyPressedEventHandler)
    EndIf
  EndIf
  
  ProcedureReturn Result
EndProcedure

;----------------------------------------------------------------------------------------



OpenWindow(0, 0, 0, 1000, 900, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

WebViewGadget(2, 0, 35, 1000, 900)
SetGadgetText(2, "file://" + #PB_Compiler_Home + "examples/sources/Data/WebView/webview.html")

SetAcceleratorKeyPressedEvent(2)

Repeat 
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
wayne-c
Enthusiast
Enthusiast
Posts: 337
Joined: Tue Jun 08, 2004 10:29 am
Location: Zurich, Switzerland

Re: WebViewGadget: Disable Printing?

Post by wayne-c »

@Fred could this be implemented natively in PureBasic, e.g. with a new attribute on WebViewGadget?

Code: Select all

SetGadgetAttribute(#WebViewGadget, #PB_Web_BlockAcceleratorKeys, #True)
https://learn.microsoft.com/en-us/dotne ... .0.1245.22

Code: Select all

_allowWebViewShortcutKeys = value;
if (_iWebView2.CoreWebView2 != null)
{
    WebViewSettings.AreBrowserAcceleratorKeysEnabled = value;
}
else if (!_allowShortcutsEventRegistered)
{
    _allowShortcutsEventRegistered = true;
    _iWebView2.CoreWebView2InitializationCompleted += (sender, e) =>
    {
        if (e.IsSuccess)
        {
            WebViewSettings.AreBrowserAcceleratorKeysEnabled = _allowWebViewShortcutKeys;
        }
    };
}
As you walk on by, Will you call my name? Or will you walk away?
breeze4me
Enthusiast
Enthusiast
Posts: 633
Joined: Thu Mar 09, 2006 9:24 am
Location: S. Kor

Re: WebViewGadget: Disable Printing?

Post by breeze4me »

wayne-c wrote: Mon Dec 09, 2024 8:00 am

Code: Select all

_allowWebViewShortcutKeys = value;
if (_iWebView2.CoreWebView2 != null)
{
    WebViewSettings.AreBrowserAcceleratorKeysEnabled = value;
}
else if (!_allowShortcutsEventRegistered)
{
    _allowShortcutsEventRegistered = true;
    _iWebView2.CoreWebView2InitializationCompleted += (sender, e) =>
    {
        if (e.IsSuccess)
        {
            WebViewSettings.AreBrowserAcceleratorKeysEnabled = _allowWebViewShortcutKeys;
        }
    };
}
It's much simpler.

Code: Select all

;----------------------------------------------------------------------------------------
; https://learn.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2settings3?view=webview2-1.0.2903.40

DataSection
  IID_ICoreWebView2Settings3:
  Data.l $fdb5ab74
  Data.w $af33, $4854
  Data.b $84, $f0, $0a, $63, $1d, $eb, $5e, $ba
EndDataSection

Procedure DisableAcceleratorKeys(WebView)
  Protected Result
  Protected Controller.ICoreWebView2Controller
  Protected CoreWebView2.ICoreWebView2
  Protected Settings.ICoreWebView2Settings, Settings3.ICoreWebView2Settings3
  
  If GadgetType(WebView) <> #PB_GadgetType_WebView : ProcedureReturn 0 : EndIf
  
  Controller = GetGadgetAttribute(WebView, #PB_WebView_ICoreController)
  If Controller = 0 : ProcedureReturn 0 : EndIf
  
  If Controller\get_CoreWebView2(@CoreWebView2) <> #S_OK Or CoreWebView2 = 0 : ProcedureReturn 0 : EndIf
  
  If CoreWebView2\get_Settings(@Settings) <> #S_OK Or Settings = 0 : Goto Proc_Exit : EndIf
  If Settings\QueryInterface(?IID_ICoreWebView2Settings3, @Settings3) <> #S_OK Or Settings3 = 0 : Goto Proc_Exit : EndIf
  
  If Settings3\put_AreBrowserAcceleratorKeysEnabled(#False) = #S_OK
    Result = 1
  EndIf
  
  Proc_Exit:
  If Settings3 : Settings3\Release() : EndIf
  If Settings : Settings\Release() : EndIf
  If CoreWebView2 : CoreWebView2\Release() : EndIf
  
  ProcedureReturn Result
EndProcedure

;----------------------------------------------------------------------------------------



OpenWindow(0, 0, 0, 1000, 900, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

WebViewGadget(2, 0, 35, 1000, 900)
SetGadgetText(2, "file://" + #PB_Compiler_Home + "examples/sources/Data/WebView/webview.html")

DisableAcceleratorKeys(2)

Repeat 
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Post Reply