Browse Source

Merge pull request #7374 from AvaloniaUI/fixes/5849-textinput-keydown-handed-2

win32: Don't raise TextInput event when KeyDown was handled (Attempt #2)
repro/minimal-repro-stackoverflow-onewaytosource-binding
Dan Walmsley 4 years ago
parent
commit
d024d2aaee
  1. 13
      src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs
  2. 1
      src/Windows/Avalonia.Win32/WindowImpl.cs

13
src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs

@ -151,8 +151,8 @@ namespace Avalonia.Win32
}
case WindowsMessage.WM_CHAR:
{
// Ignore control chars
if (ToInt32(wParam) >= 32)
// Ignore control chars and chars that were handled in WM_KEYDOWN.
if (ToInt32(wParam) >= 32 && !_ignoreWmChar)
{
e = new RawTextInputEventArgs(WindowsKeyboardDevice.Instance, timestamp, _owner,
new string((char)ToInt32(wParam), 1));
@ -519,6 +519,15 @@ namespace Avalonia.Win32
{
Input(e);
if ((WindowsMessage)msg == WindowsMessage.WM_KEYDOWN)
{
// Handling a WM_KEYDOWN message should cause the subsequent WM_CHAR message to
// be ignored. This should be safe to do as WM_CHAR should only be produced in
// response to the call to TranslateMessage/DispatchMessage after a WM_KEYDOWN
// is handled.
_ignoreWmChar = e.Handled;
}
if (e.Handled)
{
return IntPtr.Zero;

1
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -90,6 +90,7 @@ namespace Avalonia.Win32
private bool _shown;
private bool _hiddenWindowIsParent;
private uint _langid;
private bool _ignoreWmChar;
public WindowImpl()
{

Loading…
Cancel
Save