[gelöst] Abfrage ob Tastatur vorhanden für Vista/Windows7



  • Eine Anwendung soll feststellen, ob eine Tastatur vorhanden ist oder nicht.
    Nur bei nicht vorhandener Tastatur soll eine virtuelle Tastatur bereitgestellt werden.
    Ab Windows8 gibt es dafür einfache Methoden in den .NET-Libs.
    Auf der Suche für Vista/Windows7 bin ich bisher nicht richtig fündig geworden.
    Die Anwendung soll für alle Systeme ab Vista auf Desktops und Tablets laufen.



  • if (version < win8)
       return true;
    

    ?



  • @hustbaer

    if (version < win8)
    return true;

    wie soll das rausfinden ob die Tastatur angeschlossen ist?

    @berniebutt
    wie heisst denn die "einfache Methoden in den .NET-Libs"



  • Hier die gefundendene Lösung für Windows8:

    http://stackoverflow.com/questions/14113118/is-there-a-way-to-see-if-a-physical-keyboard-is-attached-to-a-windows-8-device

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Windows.Devices.Input;  // only Windows8 or higher!
    
    namespace DetectDevice1
    {
        public partial class Form1 : Form
        {
            private bool keyboard = true;
            public Form1()
            {
                InitializeComponent();
            }
            private bool DetectKeyboard()
            {
                bool exists = true;
                KeyboardCapabilities keyboardCapabilities = new Windows.Devices.Input.KeyboardCapabilities();
                //KeyboardPresent.Text = keyboardCapabilities.KeyboardPresent != 0 ? "Yes" : "No";
                if (keyboardCapabilities.KeyboadPresent != 0) exists = true;
                else exists = false;
                return exists;
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                string text = "Keyboard exists:      ";
                keyboard = DetectKeyboard();
                if (keyboard) text += "YES";
                else          text += "NO";
                label1.Text = text;
            }
         }
    }
    

    Um Kompatbilität zu Vista/Win7 sicherzustellen, beschränke ich mich auf Visual Studio 2010.
    Dort ist die eingesetzte NET-Klasse System.Windows.Devices.Input;
    nicht verfügbar.



  • Ich fürchte dass Windows 7 Desktop einfach immer davon ausgeht dass es ein Keyboard gibt. Daher auch mein 1. Beitrag.

    Natürlich könnte man versuchen selbst alle verfügbaren Devices zu scannen und zu gucken ob etwas dabei ist was ein Keyboard sein könnte.
    Weiss aber nicht ob das sehr zuverlässig wäre.
    "Übliche" Keyboards findet man damit sicher. Aber wie es z.B. bei Remote Desktop aussieht weiss ich nicht.



  • hustbaer schrieb:

    Ich fürchte dass Windows 7 Desktop einfach immer davon ausgeht dass es ein Keyboard gibt. Daher auch mein 1. Beitrag.

    Davon kann niemand ausgehen, weil der Anwender unabhängig vom System die Tastatur jederzeit abklemmen kann.
    Bei Convertible-PCs ist das auch gewollt.



  • berniebutt schrieb:

    hustbaer schrieb:

    Ich fürchte dass Windows 7 Desktop einfach immer davon ausgeht dass es ein Keyboard gibt. Daher auch mein 1. Beitrag.

    Davon kann niemand ausgehen, weil der Anwender unabhängig vom System die Tastatur jederzeit abklemmen kann.
    Bei Convertible-PCs ist das auch gewollt.

    Ich fürchte es ist aber trotzdem so, auch wenn du glaubst es könne nicht so sein.
    Und nu?



  • Ich habe die Lösung gefunden mit:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Management;     // vs2010 --> Verweis hinzufügen!
    using System.Management.Instrumentation;
    // ------------------------------------------------------------------------------------------------
    // Prüfen, ob Tastatur vorhanden
    // ------------------------------------------------------------------------------------------------
    namespace DetectDevice1
    {
        public partial class Form1 : Form
        {
            private bool   kbExists = false;
            private string text1 = "", text2 = "";
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private bool DetectKeyboard()
            {
                bool exists = false;
                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher("Select Name from Win32_Keyboard");
                foreach (ManagementObject keyboard in searcher.Get())
                {
                    if (!keyboard.GetPropertyValue("Name").Equals(""))
                    {
                        text2 += "\nKB name:   " + keyboard.GetPropertyValue("Name");
                        exists = true;
                    }
                } 
                return exists;
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                text1 = "Keyboard exists:      ";
                kbExists = DetectKeyboard();
                if (kbExists) text1 += "YES";
                else          text1 += "NO";
                label1.Text = text1;
                label2.Text = text2;
            }
         }
    }
    

Log in to reply