Napisałem w konsoli taki prosty program do testowania klawiatury:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int WorkCounter = 0;
string LastChar = "";
Console.WriteLine("START");
while (WorkCounter < 4)
{
ConsoleKeyInfo CKI = Console.ReadKey(true);
Console.Write(" Name: " + CKI.Key.ToString());
Console.Write(" Code: " + ((int)CKI.KeyChar).ToString());
if (CKI.KeyChar > 32)
{
Console.Write(" Char: " + CKI.KeyChar.ToString());
}
Console.Write(" Shift: " + CKI.Modifiers.HasFlag(ConsoleModifiers.Shift).ToString());
Console.Write(" Ctrl: " + CKI.Modifiers.HasFlag(ConsoleModifiers.Control).ToString());
Console.Write(" Alt: " + CKI.Modifiers.HasFlag(ConsoleModifiers.Alt).ToString());
Console.WriteLine();
WorkCounter++;
string KeyId = "{" + ((int)CKI.KeyChar).ToString() + "}{" + CKI.Key.ToString() + "}";
if (LastChar != KeyId)
{
WorkCounter = 0;
LastChar = KeyId;
}
}
Console.WriteLine("STOP");
}
}
}
Jak widać, program wyświetla nazwę i numer znaku naciśniętego klawisza, a także zastosowane modyfikatory. Pięciokrotne naciśniecie tego samego klawisza kończy program. Tak naprawdę utworzyłem dwa identyczne programy, jeden jako .NET Framework 4.5, drugi jako .NET Core 3.1, jednakże w obu programach jest identyczny problem.
Programy skompilowałem w Visual Studio na Windows 10, a uruchamiam na Ubuntu Linux 20.04. Problem dotyczy klawiszy funkcyjnych od F1 do F10 oraz bloku zawierającego Ins,Del,Home,End,PgUp,PgDown (nie wiem, czy ten blok ma jakąś nazwę, będę pisać "blok Home/End" bo z tymi dwoma klawiszami jest największy problem).
Jeżeli program uruchamiam lokalnie, to działa prawidłowo, czyli pokazuje ten klawisz, jaki nacisnę. Jak połączę się lokalnie od siebie do siebie (localhost) zarówno po telnet, jak i po ssh, to program również działa prawidłowo.
Natomiast, jak się połączę z innego komputera z Windows, za pomocą PuTTY, to jest problem. W tym przypadku nie ma znaczenia, czy połączę się po SSH, czy po Telnet, a także nie ma znaczenia, czy uruchomię wersję dla net Framework, czy dla Net Core.
Problem polega na tym, ze w domyślnej konfiguracji, program Midnight Commander prawidłowo reaguje na wszystkie klawisze funkcyjne i z bloku HomeEnd. Natomiast mój program, którego kod wrzuciłem, dla klawiszy F1-F4 reaguje tak, jakbym wcisnął kolejno Esc, cyfrę 1, cyfrę numeru klawisza (np. dla F3 będzie to "3") i tyldę. Dla Home w wersji Core leci Esc, 1 i ~, dla End leci Esc, 4, ~. Dla wersji .NET leci odpowiednio 1 i 4 Pozostałe klawisze z bloku HomeEnd interpretuje prawidłowo.
Jak w konfiguracji zmienię klawisze funkcjyjne na "Xterm R6" (domyslnie było ESC[n~), to wszystkie klawisze funkcyjne działają prawidłowo, ale Home/End cały czas ma problem. Ale oczywiście MidNight Commander również działa prawidłowo.
Czy problem jest w samym programie (muszę coś skonfigurować lub doimplementować), czy w konfiguracji serwera Telnet/SSH czy w konfiguracji PuTTY? Jak to jest, że Midnight Commander prawidłowo interpretuje klawisze, a mój program już nie?