Identificare l'input da tastiere diverse

di il
9 risposte

Identificare l'input da tastiere diverse

Salve a tutti, sto creando un programma wpf dove alla pressione di un tasto questo viene mostrato a schermo, volevo sapere se c'è un modo per identificare la tastiera da cui arriva l'input così da poter gestire il programma tramite due tastiere differenti.
Grazie per l'attenzione.

9 Risposte

  • Re: Identificare l'input da tastiere diverse

    La proprietà KeyChar non prende il carattere giusto in ogni caso ? https://docs.microsoft.com/it-it/dotnet/api/system.windows.forms.keypresseventargs.keychar?view=net-5.0
  • Re: Identificare l'input da tastiere diverse

    Ciao surfernet, si la proprietà prende il carattere giusto da entrambe le tastiere ma per esempio mi serve sapere da quale tastiera arrivi così da poter eseguire operazioni differenti tramite la pressione dello stesso tasto.
    Quindi per dire, se premo il tasto F1 dalla prima tastiera il programma mi dirà: F1 da tastiera 1
    invece se premo il tasto F1 dalla seconda tastiera il programma mi dirà: F1 da tastiera 2
  • Re: Identificare l'input da tastiere diverse

    Qui progetto in C# funzionante:
    https://github.com/stevemesser/rawinpu

    il progetto 1: RawInput crea RawInput.dll
    il progetto 2: Keyboard crea Keyboard.exe per testare la dll

    nel mio sistema rileva 3 tastiere
    Tastiera1 USB:
    Tastiera1.jpg
    Tastiera1.jpg

    Tastiera3 PS/2:
    Tastiera3.jpg
    Tastiera3.jpg

  • Re: Identificare l'input da tastiere diverse

    Ciao Rubik, ho scaricato la source da github, una volta compilata però quando avvio il debug sul progetto Keyboard mi viene restituito questo errore:
    System.BadImageFormatException: 'Non è stato possibile caricare il file o l'assembly 'RawInput, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' o una delle relative dipendenze. Tentativo di caricare un programma con un formato non corretto.'
    Hai avuto errori del genere anche tu?
  • Re: Identificare l'input da tastiere diverse

    Nella risposta precedente ti ho portato a conoscenza di RawInput.dll
    L'esempio è basato su WindowsForm, mentre tu stai lavorando in WPF. Una finestra WPF non ha un Handle, bisogna crearlo, il seguente codice crea l'Handle alla finestra WPF corrente, e tre label mostrano i tasti premuti e da quale tastiera.
    Dovrai crearti la tua RawInput.dll, copiarla nella cartella del tuo progetto e aggiungerla ai riferimenti.
    Codice test in WPF, da incollare in MainWindow.xaml.cs:
    
    using System;
    using System.Windows;
    using RawInput_dll;
    using System.Windows.Interop;
    using System.Diagnostics;
    using System.Globalization;
    
    
    namespace TastiereWPF
    {
        /// <summary>
        /// Logica di interazione per MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private readonly RawInput _rawinput; // instance
            const bool CaptureOnlyInForeground = false;       
    
            public MainWindow()
            {
                InitializeComponent();
    
                // create handle to current WPF Window (this)
                IntPtr windowHandle = new WindowInteropHelper(this).EnsureHandle();
    
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    
                _rawinput = new RawInput(windowHandle, CaptureOnlyInForeground);
                _rawinput.AddMessageFilter();   // Adding a message filter will cause keypresses to be handled
                Win32.DeviceAudit();            // Writes a file DeviceAudit.txt to the current directory
                _rawinput.KeyPressed += OnKeyPressed; // add event
            }
    
            private void OnKeyPressed(object sender, RawInputEventArg e)
            {
                label1.Content = "ASCII " + e.KeyPressEvent.VKey.ToString(CultureInfo.InvariantCulture);
                label2.Content = "Tasto " + e.KeyPressEvent.VKeyName;
                label3.Content =  e.KeyPressEvent.Source;
            }
    
            private static void CurrentDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e)
            {
                var ex = e.ExceptionObject as Exception;
                if (null == ex) return;
                // Log this error. Logging the exception doesn't correct the problem but at least now
                // you may have more insight as to why the exception is being thrown.
                Debug.WriteLine("Unhandled Exception: " + ex.Message);
                Debug.WriteLine("Unhandled Exception: " + ex);
                MessageBox.Show(ex.Message);
            }
        }
    }
    
  • Re: Identificare l'input da tastiere diverse

    STAddo ha scritto:


    Ciao Rubik, ho scaricato la source da github, una volta compilata però quando avvio il debug sul progetto Keyboard mi viene restituito questo errore:
    System.BadImageFormatException: 'Non è stato possibile caricare il file o l'assembly 'RawInput, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' o una delle relative dipendenze. Tentativo di caricare un programma con un formato non corretto.'
    Hai avuto errori del genere anche tu?
    Nessun errore riscontrato, uso VS2017, forse ti occorre solo la dll compilata, se non riesci te la mando, per l'esempio usa il mio che funziona in WPF

    Non devi avviare il debug sul progetto keyboard, devi solo compilare l'intero progetto e poi avviare keyboard.exe direttamente dalla cartella bin
  • Re: Identificare l'input da tastiere diverse

    Grazie ancora per la disponibilità, credo di aver capito il problema, stavo provando la libreria su un progetto .NET e non .NET framework, infatti quando l'ho provata su .net framework ha funzionato correttamente.
  • Re: Identificare l'input da tastiere diverse

    STAddo ha scritto:


    Grazie ancora per la disponibilità, credo di aver capito il problema, stavo provando la libreria su un progetto .NET e non .NET framework, infatti quando l'ho provata su .net framework ha funzionato correttamente.
    Sopra ti ho postato il codice per usare la libreria in WPF
  • Re: Identificare l'input da tastiere diverse

    Ho convertito la libreria a .Net Core ed usando il tuo codice fuonziona perfettamente anche in WFP.
    Grazie ancora!
Devi accedere o registrarti per scrivere nel forum
9 risposte