Skip to content

Crash in WPF controls on some languages #11916

Description

@desdesdes

Description

Our WPF application crashes on machines with a non-common local (EN-be). We have pinpointed this issue to

return (short)NativeMethods.IntPtrToInt32(SafeNativeMethods.GetKeyboardLayout(_dispatcherThreadId));

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

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 dotnet/winforms#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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions