@@ -429,6 +429,9 @@ public void create(Composite parent, int style) {
429
429
handler = newCallback (this ::handleGotFocus );
430
430
controller .add_GotFocus (handler , token );
431
431
handler .Release ();
432
+ handler = newCallback (this ::handleAcceleratorKeyPressed );
433
+ controller .add_AcceleratorKeyPressed (handler , token );
434
+ handler .Release ();
432
435
if (webView_2 != null ) {
433
436
handler = newCallback (this ::handleDOMContentLoaded );
434
437
webView_2 .add_DOMContentLoaded (handler , token );
@@ -794,6 +797,63 @@ int handleGotFocus(long pView, long pArg) {
794
797
return COM .S_OK ;
795
798
}
796
799
800
+ /**
801
+ * Events are not fired for all keyboard shortcuts.
802
+ * <ul>
803
+ * <li>Events for ctrl, alt modifiers are sent, but not for shift. So we use
804
+ * GetKeyState() to read modifier keys consistently and don't send out any
805
+ * events for the modifier-only events themselves.
806
+ * <li>We are missing some other keys (e.g. VK_TAB or VK_RETURN, unless modified
807
+ * by ctrl or alt).
808
+ * </ul>
809
+ * This is a best-effort implementation oriented towards
810
+ * {@link IE#handleDOMEvent(org.eclipse.swt.ole.win32.OleEvent)}.
811
+ *
812
+ * @see <a href=
813
+ * "https://learn.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2controller">https://learn.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2controller</a>
814
+ */
815
+ int handleAcceleratorKeyPressed (long pView , long pArgs ) {
816
+ ICoreWebView2AcceleratorKeyPressedEventArgs args = new ICoreWebView2AcceleratorKeyPressedEventArgs (pArgs );
817
+ int [] virtualKey = new int [1 ];
818
+ args .get_VirtualKey (virtualKey );
819
+ int [] lparam = new int [1 ];
820
+ args .get_KeyEventLParam (lparam );
821
+ long flags = Integer .toUnsignedLong (lparam [0 ]) >> 16 ;
822
+ boolean isDown = (flags & 0x8000 ) == 0 ;
823
+
824
+ if (virtualKey [0 ] == OS .VK_SHIFT || virtualKey [0 ] == OS .VK_CONTROL || virtualKey [0 ] == OS .VK_MENU ) {
825
+ return COM .S_OK ;
826
+ }
827
+
828
+ Event keyEvent = new Event ();
829
+ keyEvent .widget = browser ;
830
+ keyEvent .keyCode = translateKey (virtualKey [0 ]);
831
+ if (OS .GetKeyState (OS .VK_MENU ) < 0 ) keyEvent .stateMask |= SWT .ALT ;
832
+ if (OS .GetKeyState (OS .VK_SHIFT ) < 0 ) keyEvent .stateMask |= SWT .SHIFT ;
833
+ if (OS .GetKeyState (OS .VK_CONTROL ) < 0 ) keyEvent .stateMask |= SWT .CONTROL ;
834
+
835
+ if (isDown ) {
836
+ keyEvent .type = SWT .KeyDown ;
837
+ // Ignore repeated events while key is pressed
838
+ boolean isRepeat = (flags & 0x4000 ) != 0 ;
839
+ if (isRepeat ) {
840
+ return COM .S_OK ;
841
+ }
842
+
843
+ if (!sendKeyEvent (keyEvent )) {
844
+ args .put_Handled (true );
845
+ }
846
+ } else {
847
+ keyEvent .type = SWT .KeyUp ;
848
+ browser .notifyListeners (keyEvent .type , keyEvent );
849
+ if (!keyEvent .doit ) {
850
+ args .put_Handled (true );
851
+ }
852
+ }
853
+
854
+ return COM .S_OK ;
855
+ }
856
+
797
857
int handleMoveFocusRequested (long pView , long pArgs ) {
798
858
ICoreWebView2MoveFocusRequestedEventArgs args = new ICoreWebView2MoveFocusRequestedEventArgs (pArgs );
799
859
int [] pReason = new int [1 ];
0 commit comments