diff --git a/src/RemoteViewer.Client/Views/Viewer/ViewerView.axaml b/src/RemoteViewer.Client/Views/Viewer/ViewerView.axaml index 135f785..0377a31 100644 --- a/src/RemoteViewer.Client/Views/Viewer/ViewerView.axaml +++ b/src/RemoteViewer.Client/Views/Viewer/ViewerView.axaml @@ -214,7 +214,6 @@ PointerWheelChanged="DisplayPanel_PointerWheelChanged" KeyDown="DisplayPanel_KeyDown" KeyUp="DisplayPanel_KeyUp" - TextInput="DisplayPanel_TextInput" > 100) - return; + // If KeySymbol is a printable character, send as text input + if (string.IsNullOrEmpty(e.KeySymbol) is false && + e.KeySymbol.Length == 1 && + char.IsControl(e.KeySymbol[0]) is false) + { + await this._viewModel.Connection.RequiredViewerService.SendTextInputAsync(e.KeySymbol); + } + // Non-printable keys (arrows, function keys, etc.) go through KeyDown + else + { + var keyCode = (ushort)KeyInterop.VirtualKeyFromKey(e.Key); + var modifiers = this.GetKeyModifiers(e.KeyModifiers); + await this._viewModel.Connection.RequiredViewerService.SendKeyDownAsync(keyCode, modifiers); + } - await this._viewModel.Connection.RequiredViewerService.SendTextInputAsync(e.Text); } private async void DisplayPanel_KeyUp(object? sender, KeyEventArgs e) @@ -284,15 +275,16 @@ private async void DisplayPanel_KeyUp(object? sender, KeyEventArgs e) if (this._viewModel is not { IsInputEnabled: true }) return; - // Printable characters were handled by TextInput event - if (ShouldDeferToTextInput(e.KeySymbol)) + e.Handled = true; + + // Printable characters were sent as text on KeyDown, no KeyUp needed + if (string.IsNullOrEmpty(e.KeySymbol) is false && + e.KeySymbol.Length == 1 && + char.IsControl(e.KeySymbol[0]) is false) { - e.Handled = true; return; } - e.Handled = true; - var keyCode = (ushort)KeyInterop.VirtualKeyFromKey(e.Key); var modifiers = this.GetKeyModifiers(e.KeyModifiers); await this._viewModel.Connection.RequiredViewerService.SendKeyUpAsync(keyCode, modifiers); @@ -421,15 +413,6 @@ private void ResetToolbarHideTimer() #endregion #region Helper Methods - private static bool ShouldDeferToTextInput(string? keySymbol) - { - // If KeySymbol is a printable character, let TextInput handle it. - // Control characters (Ctrl+key) and null (special keys) go through KeyDown. - return !string.IsNullOrEmpty(keySymbol) && - keySymbol.Length == 1 && - !char.IsControl(keySymbol[0]); - } - private bool TryGetNormalizedPosition(PointerEventArgs e, out float x, out float y) { x = -1;