Frage

OK, das ist eine etwas seltsame Frage.

Wir haben eine Touch-Screen-Anwendung (das heißt, keine Tastatur). Wenn Benutzer Text eingeben müssen, die Anwendung virtuelle Tastatur zeigt -. In WinForms Hand gebaut

, diese Dinge zu machen mit der Hand für jede neue Sprache ist Affe Arbeit. Ich vermute, dass Windows diese Tastaturlayout Informationen haben muss irgendwo in einem dll versteckt. Würde es trotzdem sein, um diese Informationen zu erhalten, aus dem Fenster?

Andere Ideen gern gesehen (ich zumindest herauszufinden, die Sache aus einer XML-Datei zu erzeugen ist noch besser worden zu sein, als es von Hand in VS tun).

(Hinweis: Nachdem alles gesagt was ich fest, dass es eine japanische Tastatur, Zustandsmaschine und alle ..., so XML möglicherweise nicht ausreichend)

UPDATE : ziemlich gute Serie zu diesem Thema (glaube ich) hier

War es hilfreich?

Lösung

Microsoft Keyboard Layout Creator können Systemtastaturen laden und exportieren wie .klc Dateien . Da es in .NET geschrieben können Sie verwenden Reflector zu sehen, wie es das tut, und verwenden Sie Reflexion, es zu fahren . Hier ist ein Zip-Datei von .klc-Dateien für die 187-Tastaturen in Windows 8 unter Verwendung des unter C # Code erstellt. Beachten Sie, dass ich schrieb diese ursprünglich für Windows XP und jetzt mit Windows 8 und die On-Screen-Tastatur, es ist wirklich langsam und scheint die Taskleiste zu einem Absturz: / Aber es funktioniert:)

using System;
using System.Collections;
using System.IO;
using System.Reflection;

class KeyboardExtractor {

    static Object InvokeNonPublicStaticMethod(Type t, String name,
            Object[] args)
    {
        return t.GetMethod(name, BindingFlags.Static | BindingFlags.NonPublic)
            .Invoke(null, args);
    }

    static void InvokeNonPublicInstanceMethod(Object o, String name,
            Object[] args)
    {
        o.GetType().GetMethod(name, BindingFlags.Instance |
                BindingFlags.NonPublic) .Invoke(o, args);
    }

    static Object GetNonPublicProperty(Object o, String propertyName) {
        return o.GetType().GetField(propertyName,
                BindingFlags.Instance | BindingFlags.NonPublic)
            .GetValue(o);
    }

    static void SetNonPublicField(Object o, String propertyName, Object v) {
        o.GetType().GetField(propertyName,
                BindingFlags.Instance | BindingFlags.NonPublic)
            .SetValue(o, v);
    }

    [STAThread] public static void Main() {
        System.Console.WriteLine("Keyboard Extractor...");

        KeyboardExtractor ke = new KeyboardExtractor();
        ke.extractAll();

        System.Console.WriteLine("Done.");
    }

    Assembly msklcAssembly;
    Type utilitiesType;
    Type keyboardType;
    String baseDirectory;

    public KeyboardExtractor() {
        msklcAssembly = Assembly.LoadFile("C:\\Program Files\\Microsoft Keyboard Layout Creator 1.4\\MSKLC.exe");
        utilitiesType = msklcAssembly.GetType("Microsoft.Globalization.Tools.KeyboardLayoutCreator.Utilities");
        keyboardType = msklcAssembly.GetType("Microsoft.Globalization.Tools.KeyboardLayoutCreator.Keyboard");

        baseDirectory = Directory.GetCurrentDirectory();
    }

    public void extractAll() {

        DateTime startTime = DateTime.UtcNow;

        SortedList keyboards = (SortedList)InvokeNonPublicStaticMethod(
                utilitiesType, "KeyboardsOnMachine", new Object[] {false});

        DateTime loopStartTime = DateTime.UtcNow;

        int i = 0;
        foreach (DictionaryEntry e in keyboards) {
            i += 1;
            Object k = e.Value;

            String name = (String)GetNonPublicProperty(k, "m_stLayoutName");
            String layoutHexString = ((UInt32)GetNonPublicProperty(k, "m_hkl"))
                .ToString("X");

            TimeSpan elapsed = DateTime.UtcNow - loopStartTime;
            Double ticksRemaining = ((Double)elapsed.Ticks * keyboards.Count)
                        / i - elapsed.Ticks;
            TimeSpan remaining = new TimeSpan((Int64)ticksRemaining);
            String msgTimeRemaining = "";
            if (i > 1) {
                // Trim milliseconds
                remaining = new TimeSpan(remaining.Hours, remaining.Minutes,
                        remaining.Seconds);
                msgTimeRemaining = String.Format(", about {0} remaining",
                        remaining);
            }
            System.Console.WriteLine(
                    "Saving {0} {1}, keyboard {2} of {3}{4}",
                    layoutHexString, name, i, keyboards.Count,
                    msgTimeRemaining);

            SaveKeyboard(name, layoutHexString);

        }

        System.Console.WriteLine("{0} elapsed", DateTime.UtcNow - startTime);

    }

    private void SaveKeyboard(String name, String layoutHexString) {
        Object k = keyboardType.GetConstructors(
                BindingFlags.Instance | BindingFlags.NonPublic)[0]
            .Invoke(new Object[] {
                        new String[] {"", layoutHexString},
                    false});

        SetNonPublicField(k, "m_fSeenOrHeardAboutPropertiesDialog", true);
        SetNonPublicField(k, "m_stKeyboardTextFileName",
                String.Format("{0}\\{1} {2}.klc",
                    baseDirectory, layoutHexString, name));
        InvokeNonPublicInstanceMethod(k, "mnuFileSave_Click",
                new Object[] {new Object(), new EventArgs()});

        ((IDisposable)k).Dispose();
    }

}

Im Grunde wird es eine Liste aller Tastaturen auf dem System, dann für jeden, lädt sie in MSKLC, setzt das „Speichern unter“ Dateiname, liegt darüber, ob es bereits die benutzerdefinierten Tastatureigenschaften konfiguriert und simuliert dann ein klicken Sie auf die Datei. -> Speichern Menüpunkt

Andere Tipps

Warum Sie nicht verwenden, um die On-Screen-Tastatur (osk.exe)? Sieht aus wie Sie das Rad neu zu erfinden. Und nicht das einfachste!

Es ist eine ziemlich wohlbekannte Tatsache, dass MSKLC nicht in der Lage ist, treu zu importieren und Tastatur-Layout für all DLL-Dateien wiedergeben, geliefert von Windows besonders die in Windows 8 und höher. Und es tut nicht gut zu wissen, wo sich diese Dateien sind, wenn Sie keine sinnvolle oder hilfreiche Informationen aus ihnen extrahieren kann. Dies wird dokumentiert durch Michael Kaplan in seinem Blog (er war ein Entwickler von MSKLC), die ich sehe, Sie haben oben verknüpft.

Wenn MSKLC etwas trifft es nicht versteht, wird dieser Teil entfernt. Extrahieren Sie das Layout mit MSKLC für die meisten Tastaturen funktionieren wird, aber es gibt ein paar, nämlich die Cherokee-Tastatur, und die japanischen und koreanischen Tastaturen (ein paar zu nennen, ich bin nicht sicher, wie viele es sind) -für welche die extrahierte Layout nicht genau oder vollständig reflektiert die tatsächliche Nutzung und Funktionen der Tastatur. Die Cherokee-Tastatur hat Tottasten gekettet, die MSKLC nicht unterstützt. Und die fernöstlichen Tastaturen haben Zusatztasten, die MSKLC ist nicht bekannt, dass ganze-Schichten / Schaltzustände bedeutet, die fehlen!

Michael Kaplan einige Code liefert und entriegelt einige der Geheimnisse der MSLKC und der zugehörigen Software, die verwendet werden können einige dieser Einschränkungen zu umgehen, aber es erfordert eine ganze Menge Dinge, indem Sie von Hand genau das, was Sie versuchen zu vermeiden! Außerdem sind Michaels Ziele gesetzt, Tastaturen mit Funktionen erstellen, die MSKLC kann nicht erstellen oder verstehen, die aber in Windows arbeiten (das ist das Gegenteil von dem, was der OP zu erreichen versucht).

Ich bin sicher, dass meine Lösung zu spät kommt zum OP von Nutzen zu sein, aber vielleicht wird es auch in Zukunft jemand in einer ähnlichen Situation hilfreich sein. Das ist meine Hoffnung und Grund für dieses Posting.

Bisher alles getan, was ich habe, ist zu erklären, dass die anderen Antworten nicht ausreichen. Selbst die beste nicht und nicht in vollem Umfang kann und genau alle Windows-nativen Tastaturen reproduzieren und sie in KLC Quelldateien machen. Das ist wirklich bedauerlich, und es ist sicherlich nicht die Schuld des Autors, weil das ein sehr kluges Stück Code / script ist! Zum Glück des Skript & die Quelldateien (dessen Link oder nicht noch funktionieren kann) ist nützlich und wirksam für die meisten Windows-Tastaturen sowie alle benutzerdefinierten Tastaturen von MSKLC erstellt.

Die Tastaturen, die die erweiterten Funktionen, die MSKLC nicht vom Windows-DDK erstellt unterstützt wurden, aber diese Merkmale nicht offiziell dokumentiert. Obwohl man durch das Studium der Quelldateien, die mit MSKLC einiges über ihr Potenzial lernen kann.

Leider ist die einzige Lösung, die ich anbieten kann, ist 3rd-Party, bezahlte Software namens KbdEdit . Ich glaube, es ist die einzige derzeit verfügbare Lösung, die treu tatsächlich in der Lage ist, zu entschlüsseln und neu erstellen eine der Windows-mitgelieferten Tastaturen-obwohl es einige Funktionen, die noch nicht (wie Tasten-Kombinationen wiedergeben kann / Hotkeys, die spezielle Muttersprache durchführen Funktionen, zum Beispiel:. Strg + CapsLock KanaLock (eine japanische Veränderungsschicht) aktivieren KbdEdit DOES reproduzieren getreu, dass Veränderungsschicht entfernt, die MSKLC mit Streife, es funktioniert einfach nicht diese alternativen Verfahren zur Aktivierung dieses Schaltzustandes unterstützen, wenn Sie nicht tun hat eine japanische Tastatur mit einem KanaLock Schlüssel. Obwohl, es erlauben Ihnen, eine Taste auf der Tastatur zu einem Kana Schlüssel zu konvertieren (vielleicht Scroll Lock?).

Zum Glück keine diesen nicht unterstützten Funktionen sind auch anwendbar auf eine On-Screen-Tastatur.

KbdEdit ist ein wirklich leistungsfähiges und erstaunliches Werkzeug, und es war jeden Cent wert ich dafür bezahlt! (Und das ist nicht etwas, was ich so gut wie jede andere Software bezahlt sagen würde ...) Auch wenn KbdEdit 3rd-Party-Software ist, ist es nur notwendig, um die Tastaturen zu schaffen, sie nicht zu verwenden. Alle der Tastaturen wird installiert es Arbeit nativ auf jedem Windows-System ohne KbdEdit erstellt. Es unterstützt bis zu15 Modifikator Zustände und drei Additionszusatztasten, eine, die togglable artiger CapsLock ist. Es unterstützt auch Tottasten gekettet, und Remapping eine der Tasten auf den meisten jeder Tastatur.

Bitte überprüfen Sie folgende Windows-API

 [DllImport("user32.dll")]
 private static extern long LoadKeyboardLayout(string pwszKLID, uint Flags);

Überprüfen Sie MSDN hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top