Não foi possível enviar tecla de retrocesso usando :: SendInput () para aplicação do WordPad

StackOverflow https://stackoverflow.com/questions/2421485

Pergunta

Eu tenho usado SendInput () ganchos função e janelas de teclado para desenvolver um teclado personalizado para línguas indianas. Projeto está em Google Code aqui: http://code.google.com/p/ekalappai

funções

O gancho keyboad e SendInput são colocados em uma dll win32. E eles são chamados de um exe Qt. Nosso aplicativo funciona bem para a maioria das teclas e aplicações. Eu acho o seguinte problema:

Eu não poderia enviar tecla Backspace para algumas aplicações como Wordpad / Openoffice / MsOffice. Acho mesmo problema com arrowkeys e chaves de exclusão.

Aqui está o meu código:

extern "C" __declspec(dllexport) void GenerateKey(int vk , bool bExtended)
{
    //update previous characters
    previous_2_character = previous_1_character;
    previous_1_character = vk;

    KEYBDINPUT kb={0};
    INPUT Input={0};

    //keydown
    kb.wVk    =  0;
    kb.wScan = vk;/*enter unicode here*/;
    kb.dwFlags = KEYEVENTF_UNICODE; // KEYEVENTF_UNICODE=4
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;

    ::SendInput(1,&Input,sizeof(Input));

    //keyup
    kb.wVk    =  0;
    kb.wScan = vk;/*enter unicode here*/;
    kb.dwFlags = KEYEVENTF_UNICODE|KEYEVENTF_KEYUP; //KEYEVENTF_UNICODE=4
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;

    ::SendInput(1,&Input,sizeof(Input));
}

código dll completa é aqui: http : //code.google.com/p/ekalappai/source/browse/trunk/ekhook/ekhook/dllmain.cpp

código de chamada:

generatekey = (GenerateKey) myLib->resolve( "GenerateKey" );

generatekey(44,FALSE); //comma - THis works in wordpad/MsOffice/Openoffice
generatekey(2949,FALSE); //tamil character "a" works in Wordpad/Msoffice/Openoffice

generatekey(8,FALSE); //backspace - This is NOT working in Wordpad/Msoffice/Openoffice

código de chamada completa do Qt Exe está aqui: http://code.google.com/p/ ekalappai / fonte / browse / trunk / ekalappai / window.cpp

Eu tentei procurar no google mas não poderia multar uma solução ainda. Se alguém tem idéia sobre como resolver esse pls ajuda. Obrigado.

Foi útil?

Solução

Você está misturando-se a tecla virtual e o código de verificação. O membro wVk é a mais importante, o código de verificação será usado apenas que a chave virtual é ambígua. Fix:

kb.wVk   = vk;
kb.wScan = 0;   // TODO: look at VkKeyScanEx()

Outras dicas

A documentação diz:

Se KEYEVENTF_UNICODE for especificado, SendInput envia uma mensagem WM_KEYDOWN ou WM_KEYUP a fila de mensagens do segmento de primeiro plano com wParam igual a VK_PACKET. Uma vez GetMessage ou PeekMessage obtém esta mensagem, passando a mensagem para mensagens TranslateMessage uma mensagem WM_CHAR com o caractere Unicode especificado originalmente pelo WSCAN.

Apenas um palpite, mas os programas de processamento de texto pode estar provocando o comportamento de retrocesso fora de mensagens WM_KEYDOWN / WM_KEYUP e não WM_CHAR. Assim, eles podem estar esperando VK_BACKSPACE (não VK_PACKET) como o wParam dessas mensagens. Pode até ser feito com aceleradores baseados em não VKEYs personagens ... que diabo, você está no Windows, portanto, praticamente qualquer coisa é possível. :)

Você não tentou usar KEYEVENTF_UNICODE, e fazendo kb.wVk = VK_BACKSPACE?

(Além disso, você pode usar Spy ++ para ter uma melhor idéia do que as principais mensagens são enviadas para o aplicativo de destino e como ele difere de quando você bate um retrocesso literal.)

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