WebViewGadget: Disable Printing?
WebViewGadget: Disable Printing?
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?
Re: WebViewGadget: Disable Printing?
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
Re: WebViewGadget: Disable Printing?
@Fred could this be implemented natively in PureBasic, e.g. with a new attribute on WebViewGadget?
https://learn.microsoft.com/en-us/dotne ... .0.1245.22
Code: Select all
SetGadgetAttribute(#WebViewGadget, #PB_Web_BlockAcceleratorKeys, #True)
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?
Re: WebViewGadget: Disable Printing?
It's much simpler.wayne-c wrote: Mon Dec 09, 2024 8:00 amCode: 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; } }; }
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