WPF: Событие клавиатуры не срабатывает при использовании TeamViewer, а локальные / удаленные языки ввода не совпадают - PullRequest
0 голосов
/ 06 сентября 2018

Я только что заметил странную вещь и надеялся, что кто-нибудь сможет помочь мне разгадать эту загадку.

Я использую TeamvViewer для подключения к своим рабочим машинам и устранения проблем с приложением WPF, которое я написал. В наших системах обычно установлено несколько языков ввода с клавиатуры. Я заметил, что если выбранный язык ввода на моем локальном компьютере отличается от языка на удаленном компьютере, и я ввожу любой текст, то на удаленном компьютере будет введен текст в любой элемент управления с фокусом, НО ... событие клавиатуры этого элемента управления не будет срабатывать (PreviewKeyDown, KeyDown, PreviewKeyUp, KeyUp).

Это легко продемонстрировать с помощью следующего кода WPF, который запускается через TeamViewer. Кто-нибудь знает, почему это происходит?

XAML:

<Window x:Class="TestWpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        PreviewKeyDown="MainWindow_OnPreviewKeyDown"
        KeyDown="MainWindow_OnKeyDown"
        PreviewKeyUp="MainWindow_OnPreviewKeyUp"
        KeyUp="MainWindow_OnKeyUp"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBlock
            x:Name="PreviewKeyDownLog"
        />
        <TextBlock
            x:Name="KeyDownLog"
        />
        <TextBlock
            x:Name="PreviewKeyUpLog"
        />
        <TextBlock
            x:Name="KeyUpLog"
        />
        <TextBox/>
    </StackPanel>
</Window>

XAML код позади:

using System;
using System.Printing;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Speedocs.Helpers;

namespace TestWpfApplication
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void MainWindow_OnKeyUp(object sender, KeyEventArgs e)
        {
            KeyUpLog.Text = "Key up " + Guid.NewGuid();
        }

        private void MainWindow_OnPreviewKeyDown(object sender, KeyEventArgs e)
        {
            PreviewKeyDownLog.Text = "Preview key down " + Guid.NewGuid();
        }

        private void MainWindow_OnKeyDown(object sender, KeyEventArgs e)
        {
            KeyDownLog.Text = "Key down " + Guid.NewGuid();
        }

        private void MainWindow_OnPreviewKeyUp(object sender, KeyEventArgs e)
        {
            PreviewKeyUpLog.Text = "Preview key up " + Guid.NewGuid();
        }
    }
}
...