Não foi possível enviar tecla de retrocesso usando :: SendInput () para aplicação do WordPad
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çõesO 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.
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.)