使用国际键盘时,Windows 10上的WPF应用程序崩溃

时间:2018-05-28 13:39:12

标签: c# wpf windows-10 culture

在具有英语国际键盘设置的Windows 10上测试WPF .Net应用程序会导致应用程序崩溃并显示错误Culture ID 8192 (0x2000) is not a supported culture.

键入文本框时发生崩溃。

该错误无法在Windows 7上重现,并在设置另一个键盘时在Windows 10上解决。

目标框架是.Net 3.5。

stacktrace(法语版)对我没什么帮助,直接在微软的代码中:

System.ArgumentException: L'ID de culture 8192 (0x2000) n'est pas une culture prise en charge.
Nom du paramètre : culture
   à System.Globalization.CultureTableRecord.GetCultureTableRecord(Int32 cultureId, Boolean useUserOverride)
   à System.Globalization.CultureInfo..ctor(Int32 culture, Boolean useUserOverride)
   à System.Windows.Input.InputLanguageSource.get_CurrentInputLanguage()
   à System.Windows.Input.InputLanguageManager.get_CurrentInputLanguage()
   à System.Windows.Documents.TextSelection.EnsureCaret(Boolean isBlinkEnabled, CaretScrollMethod scrollMethod)
   à System.Windows.Documents.TextSelection.System.Windows.Documents.ITextSelection.UpdateCaretAndHighlight()
   à System.Windows.Documents.TextEditor.OnGotKeyboardFocus(Object sender, KeyboardFocusChangedEventArgs e)
   à System.Windows.Controls.Primitives.TextBoxBase.OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
   à System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   à System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   à System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   à System.Windows.Input.InputManager.ProcessStagingArea()
   à System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   à System.Windows.Input.KeyboardDevice.ChangeFocus(DependencyObject focus, Int32 timestamp)
   à System.Windows.Input.KeyboardDevice.Focus(DependencyObject focus, Boolean askOld, Boolean askNew)
   à System.Windows.Input.KeyboardDevice.Focus(IInputElement element)
   à System.Windows.UIElement.Focus()
   à System.Windows.Documents.TextEditorMouse.MoveFocusToUiScope(TextEditor This)
   à System.Windows.Documents.TextEditorMouse.OnMouseDown(Object sender, MouseButtonEventArgs e)
   à System.Windows.Controls.Primitives.TextBoxBase.OnMouseDown(MouseButtonEventArgs e)
   à System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)
   à System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   à System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   à System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   à System.Windows.Input.InputManager.ProcessStagingArea()
   à System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   à System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   à System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   à System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   à System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   à MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   à MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   à System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   à System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   à System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   à MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   à MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   à System.Windows.Threading.Dispatcher.TranslateAndDispatchMessage(MSG& msg)
   à System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   à System.Windows.Application.RunInternal(Window window)
   à MyApp.App.Main()

寻求帮助,请...

编辑:定位.Net 4.0解决了这个问题。但令人遗憾的是,我们必须以3.5为目标,以确保与此应用程序的旧操作系统兼容。

这个事实让这个问题很奇怪,但我想保留它以防万一有人可以提供帮助。

解决方案:这是一个转变而不是解决方案:我们加入了 OnStartup(StartupEventArgs e)一些代码,用于警告用户文化设置是否引发异常并关闭应用程序:

try
{
    CultureInfo cul = new CultureInfo(System.Windows.Forms.InputLanguage.CurrentInputLanguage.Culture.LCID, true);
}
catch
{
    //warn the user...

    Current.Shutdown();
}

1 个答案:

答案 0 :(得分:0)

我在程序调用的库中遇到了这个问题,似乎对Windows文化不屑一顾。

最后,在深入研究堆栈跟踪并找出问题出在哪里之后,我想出了一种解决方法,即遍历所有已安装的输入语言,跳过具有“损坏的”文化的语言,并设置{{1 }}到剩下的最适用的一个。

可以专门检查键盘布局,因此使用第一个具有相同布局名称的键盘应该可以完成工作而不会弄乱任何东西。

该代码要求引用System.Windows.Forms.InputLanguage.CurrentInputLanguage

System.Windows.Forms