Pergunta

OK, esta é uma pergunta um pouco estranho.

Nós temos uma aplicação de tela de toque (ou seja, sem teclado). Quando os usuários precisam digitar o texto, a mostra de aplicação teclado virtual -. À mão construído em WinForms

Fazendo estas coisas à mão para cada nova língua é o trabalho de macaco. Eu acho que as janelas devem ter esse layout de teclado em algum lugar informações esconderijo em algum dll. Haveria uma maneira de obter essa informação para fora das janelas?

Outras idéias boas-vindas (I figura, pelo menos, gerando a coisa de um arquivo xml tem que ser melhor do que fazê-lo à mão em VS).

(Nota: tendo dito tudo o que, noto que há um teclado, máquina de estado japonês e tudo ..., por isso XML pode não ser suficiente)

Atualizar : Série muito bom sobre este assunto (eu acredito) aqui

Foi útil?

Solução

teclados

Microsoft Keyboard Layout Creator sistema de carga pode e exportá-los como arquivos .klc . Uma vez que é escrito em .NET você pode usar refletor para ver como ele faz isso, e usar a reflexão para dirigi-lo . Aqui está um arquivo zip de arquivos .klc para os 187 teclados no Windows 8 criada usando o abaixo código C #. Nota que eu originalmente escrevi isso para o Windows XP, e agora com o Windows 8 eo teclado na tela, é muito lento e parece bater a barra de tarefas: / No entanto, ela não funciona:)

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();
    }

}

Basicamente, ele recebe uma lista de todos os teclados no sistema, em seguida, para cada um, carrega em MSKLC, define o nome do arquivo "Salvar como", mentiras sobre se ele já está configurado as propriedades de teclado personalizados, e depois simula um clique no arquivo -.> item de menu Salvar

Outras dicas

Por que você não usar o teclado na tela (osk.exe)? Parece que você re-inventar a roda. E não o mais fácil!

Eu sei onde estão trajeto esses arquivos DLL:

Em seu registro, você vê:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts

onde cada ramo tem algum valor como "Layout File"="KBDSP.dll". O diretório raiz é

C:\Windows\System32

e

C:\Windows\SystemWOW64

Aqueles são todos os arquivos de layout de teclado estão localizados. Por exemplo, meios KBDUS.dll "de teclado para US".

Eu tentei substituir o arquivo DLL com a minha DLL feitos por MSKLC, e eu achei que ele carrega as imagens dos mapas de layout automaticamente na "linguagem" - "método de entrada" - "preview":

enter descrição da imagem aqui

Então, nós sabemos que o mapeamento está lá na DLL.

É um fato bastante conhecido que MSKLC é incapaz de fidelidade importação e layouts de teclado reproduzir para todos os arquivos .dll fornecido pelo Windows, especialmente aqueles em Windows 8 & acima. E ele não faz qualquer bom para saber onde esses arquivos estão se você não pode extrair qualquer informação significativa ou útil deles. Isso está documentado por Michael Kaplan em seu blog (ele era um desenvolvedor de MSKLC) que eu vejo que você link acima.

Quando MSKLC encontros qualquer coisa que não entende, essa parte é removida. Extraindo o layout usando MSKLC vai funcionar para a maioria dos teclados, mas há alguns, a saber o teclado Cherokee, e os japoneses e teclados coreano (para citar alguns, eu não tenho certeza quantos mais houver), por que o extraído layout não vai com precisão ou completamente refletir o uso real e as características do teclado. O teclado Cherokee tem acorrentado chaves mortas que MSKLC não suporta. E os teclados do Extremo Oriente têm teclas modificadoras que MSKLC não está ciente da-de meios camadas inteiras / estados de mudança que estão faltando!

Michael Kaplan fornece algum código e desbloqueia alguns dos segredos da MSLKC e o software que acompanha que podem ser usados ??para contornar algumas destas limitações, mas requer uma quantidade justa de fazer as coisas em mão exatamente o que você está tentando evitar! Além disso, os objetivos de Michael visam criar teclados com características que MSKLC não pode criar ou compreender, mas que fazer o trabalho no Windows (que é o oposto do que o OP está tentando realizar).

Estou certo de que a minha solução vem tarde demais para ser de utilidade para o OP, mas talvez ele vai ser útil no futuro para alguém em uma situação similar. Essa é a minha esperança e razão para postar isso.

Até agora, tudo o que eu tenho feito é explicar que as outras respostas são insuficientes. Mesmo o melhor não vai e não pode totalmente e com precisão reproduzir todas teclados nativos do Windows' e torná-los em arquivos de origem KLC. Este é realmente lamentável e certamente não é culpa do seu autor porque é uma peça muito inteligente de código / script! Felizmente o script e os arquivos de origem (cuja ligação pode ou não ainda trabalho) é útil e eficaz para a maioria dos teclados do Windows, bem como quaisquer teclados personalizados criado por MSKLC.

Os teclados que têm os recursos avançados que MSKLC não suporte foram criados pelo Windows DDK, mas esses recursos não são documentadas oficialmente. Embora se possa aprender um pouco sobre o seu potencial através do estudo dos arquivos de origem fornecidos com MSKLC.

Infelizmente a única solução que eu posso oferecer é 3rd party, software pago chamado KbdEdit . Eu acredito que é a única solução disponível atualmente que é realmente capaz de fielmente decodificação e recriar qualquer uma das janelas fornecido teclados embora existam algumas características avançadas que ainda não podem se reproduzir (tais como combinações de teclas / hotkeys que realizam língua nativa especial funções; por exemplo:. Ctrl + CapsLock para ativar KanaLock (a camada modificador japonês) KbdEdit fAZ reproduzir fielmente essa camada modificador que MSKLC com tira de distância, ele simplesmente não suporta este método alternativo de ativar esse estado turno se não o fizer tem um teclado japonês com uma chave de bloqueio Kana. Embora, ele permitirá que você converter uma tecla no teclado para uma chave Kana (talvez Scroll Lock?).

Felizmente, nenhum desses recursos não suportados são ainda aplicável a um teclado na tela.

KbdEdit é uma ferramenta muito poderosa e incrível, e valeu a pena cada centavo que eu pago por isso! (E isso não é algo que eu gostaria de dizer sobre praticamente qualquer outro software pago ...) Mesmo que KbdEdit é software 3rd party, só é necessário para criar os teclados, não usá-los. Todos os teclados que cria trabalho nativamente em qualquer sistema Windows sem KbdEdit sendo instalado. Ele suporta até15 estados modificadoras e três teclas modificadoras disso, um que é togglable-like CapsLock. Ele também suporta acorrentado teclas mortas, e remapeamento qualquer uma das teclas em mais nenhum teclado.

Verifique seguinte o Windows API

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

Verifique MSDN aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top