#11916·wpf

Crash in WPF controls on some languages

Author: desdesdesCreated Sep 9, 2026Updated Sep 18, 2026

Description

Our WPF application crashes on machines with a non-common local (EN-be). We have pinpointed this issue to https://github.com/dotnet/wpf/blob/22c053cf86737384a222d37c79e211639ff20f91/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/InputLanguageSource.cs#L216

The keyboard layout contains a high bit (1080C on a EN-be layout) than it is converted to a short which contains a negative value. When the controls ask for the CurrentInputLanguage in https://github.com/dotnet/wpf/blob/22c053cf86737384a222d37c79e211639ff20f91/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/InputLanguageSource.cs#L104 a new culture is create with this nevative value which crash the application.

One of the call stacks in our application

Description.....: culture ('-4066') must be a non-negative value. (Parameter 'culture')
                  Actual value was -4066.
Type............: System.ArgumentOutOfRangeException
HResult.........: -2146233086 (0x80131502)
Source..........: System.Private.CoreLib
TargetSite......: Void ThrowNegative[T](T, System.String)
DeclaringType...: System.ArgumentOutOfRangeException, System.Private.CoreLib
ProductVersion..: 9.0.17+f2c8152eed158e72950025393fde498c90a57a6b
 
================================================================
 
   at System.ArgumentOutOfRangeException.ThrowNegative[T](T value, String paramName)
   at System.Globalization.CultureInfo..ctor(Int32 culture, Boolean useUserOverride)
   at System.Windows.Input.InputLanguageSource.get_CurrentInputLanguage()
   at System.Windows.Documents.TextSelection.EnsureCaret(Boolean isBlinkEnabled, Boolean isSelectionActive, CaretScrollMethod scrollMethod)
   at System.Windows.Documents.TextSelection.System.Windows.Documents.ITextSelection.UpdateCaretAndHighlight()
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.KeyboardDevice.ChangeFocus(DependencyObject focus, Int32 timestamp)
   at System.Windows.Input.KeyboardDevice.Focus(DependencyObject focus, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
   at System.Windows.Input.KeyboardDevice.Focus(IInputElement element)
   at System.Windows.UIElement.Focus()
   at Afas.Profit.Controls.Views.ViewFilterExtensions.SetFocusToFilterCell(GridControl source, String withValue, Boolean selectAll) in C:\Dev\profit-release\10\src\Anta\Projects\Cool

Reproduction Steps

use powershell on an machine with the language EN-be.

Add-Type -Namespace Win -Name Kbd -MemberDefinition @'
[DllImport("user32.dll")] public static extern int GetKeyboardLayoutList(int nBuff, [Out] IntPtr[] lpList);
'@

$count = [Win.Kbd]::GetKeyboardLayoutList(0, $null)
$list  = New-Object IntPtr[] $count
[void][Win.Kbd]::GetKeyboardLayoutList($count, $list)

foreach ($hkl in $list) {
    $v  = $hkl.ToInt64() -band 0xFFFFFFFF
    $lw = $v -band 0xFFFF
    $signed = if ($lw -ge 0x8000) { $lw - 0x10000 } else { $lw }
    '{0:X8}   langid=0x{1:X4}   WPF passes {2}' -f $v, $lw, $signed
}

Expected behavior

This should just work.

Actual behavior

Application crash.

Regression?

WinForms used to haver the same issue, but it was fixed in https://github.com/dotnet/winforms/pull/8573

Known Workarounds

None

Impact

No response

Configuration

I am running .net 10 on a window 25200.9445 on a x64. The issue only appears on machine with a languageid which have lager than 32,767 (decimal value).

Other information

No response