@@ -608,7 +608,7 @@ private void NoInliningConstructor()
608608
609609 browserSettings = Core . ObjectFactory . CreateBrowserSettings ( autoDispose : true ) ;
610610
611- WpfKeyboardHandler = new WpfKeyboardHandler ( this ) ;
611+ SetupWpfKeyboardHandler ( ) ;
612612
613613 PresentationSource . AddSourceChangedHandler ( this , PresentationSourceChangedHandler ) ;
614614
@@ -753,6 +753,13 @@ private void InternalDispose(bool disposing)
753753 // is called.
754754 LifeSpanHandler = null ;
755755
756+ var inputLangManager = InputLanguageManager . Current ;
757+
758+ if ( inputLangManager != null )
759+ {
760+ inputLangManager . InputLanguageChanged -= OnInputLangageChanged ;
761+ }
762+
756763 WpfKeyboardHandler ? . Dispose ( ) ;
757764 WpfKeyboardHandler = null ;
758765
@@ -769,6 +776,32 @@ private void InternalDispose(bool disposing)
769776 Cef . RemoveDisposable ( this ) ;
770777 }
771778
779+ private void SetupWpfKeyboardHandler ( )
780+ {
781+ try
782+ {
783+ var inputLang = InputLanguageManager . Current . CurrentInputLanguage ;
784+
785+ var useImeKeyboardHandler = WpfImeKeyboardHandler . UseImeKeyboardHandler ( inputLang . KeyboardLayoutId ) ;
786+
787+ if ( useImeKeyboardHandler )
788+ {
789+ WpfKeyboardHandler = new WpfImeKeyboardHandler ( this ) ;
790+ }
791+ else
792+ {
793+ InputLanguageManager . Current . InputLanguageChanged += OnInputLangageChanged ;
794+
795+ WpfKeyboardHandler = new WpfKeyboardHandler ( this ) ;
796+ }
797+ }
798+ catch ( Exception )
799+ {
800+ // For now we'll ignore any errors and just use the default keyboard handler
801+ WpfKeyboardHandler = new WpfKeyboardHandler ( this ) ;
802+ }
803+ }
804+
772805 /// <summary>
773806 /// Gets the ScreenInfo - currently used to get the DPI scale factor.
774807 /// </summary>
@@ -1719,6 +1752,26 @@ private void OnDragEnter(object sender, DragEventArgs e)
17191752 }
17201753 }
17211754
1755+ private void OnInputLangageChanged ( object sender , InputLanguageEventArgs e )
1756+ {
1757+ // If we are already using the WpfImeKeyboardHandler then we'll ignore any changes
1758+ if ( WpfKeyboardHandler ? . GetType ( ) == typeof ( WpfImeKeyboardHandler ) )
1759+ {
1760+ return ;
1761+ }
1762+
1763+ var useImeKeyboardHandler = WpfImeKeyboardHandler . UseImeKeyboardHandler ( e . NewLanguage . KeyboardLayoutId ) ;
1764+
1765+ if ( useImeKeyboardHandler )
1766+ {
1767+ var oldKeyboardHandler = WpfKeyboardHandler ;
1768+ WpfKeyboardHandler = new WpfImeKeyboardHandler ( this ) ;
1769+ oldKeyboardHandler ? . Dispose ( ) ;
1770+
1771+ InputLanguageManager . Current . InputLanguageChanged -= OnInputLangageChanged ;
1772+ }
1773+ }
1774+
17221775 /// <summary>
17231776 /// PresentationSource changed handler.
17241777 /// </summary>
0 commit comments