Impossibile inviare tasto backspace usando :: SendInput () per l'applicazione WordPad
Domanda
ganci SendInput ho usato function () e tastiera di Windows per sviluppare una tastiera personalizzata per le lingue indiane. Progetto è in Google Code qui: http://code.google.com/p/ekalappai
Il gancio keyboad e le funzioni SendInput sono collocati in un DLL Win32. Ed essi sono chiamati da un exe Qt. La nostra applicazione funziona bene per la maggior parte delle chiavi e delle applicazioni. Trovo il seguente problema:
Non ho potuto inviare tasto Backspace per alcune applicazioni come Wordpad / Openoffice / MsOffice. Trovo stesso problema con arrowkeys ed eliminare le chiavi.
Qui è il mio codice:
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));
}
Codice dll completa è qui: http : //code.google.com/p/ekalappai/source/browse/trunk/ekhook/ekhook/dllmain.cpp
Prefisso telefonico internazionale:
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
codice chiamante completa da Qt Exe è qui: http://code.google.com/p/ ekalappai / source / browse / trunk / ekalappai / window.cpp
Ho provato a cercare in google ma non poteva multare una soluzione ancora. Se qualcuno ha idea su come risolvere questo pls aiuto. Grazie.
Soluzione
si stia mescolando il tasto virtuale e il codice di scansione. L'organo WVK è quello importante, il codice di scansione viene usata solo la chiave virtuale è ambigua. Correzione:
kb.wVk = vk;
kb.wScan = 0; // TODO: look at VkKeyScanEx()
Altri suggerimenti
La documentazione dice:
Se non viene specificato KEYEVENTF_UNICODE, SendInput invia un WM_KEYDOWN o WM_KEYUP messaggio alla coda di messaggi del thread in primo piano con wParam pari a VK_PACKET. Una volta GetMessage o PeekMessage ottiene questo messaggio, passando il messaggio a TranslateMessage messaggi un messaggio WM_CHAR con il carattere Unicode originariamente specificato da wScan.
Solo una supposizione, ma la parola programmi di elaborazione possono essere innescare il comportamento backspace off di messaggi WM_KEYDOWN / WM_KEYUP e non WM_CHAR. Così essi possono essere in attesa VK_BACKSPACE (non VK_PACKET) come il wParam di quei messaggi. Si potrebbe anche essere fatto con gli acceleratori basati su non VKEYs personaggi ... diamine, siete su Windows, quindi praticamente tutto è possibile. :)
Non avete provato a usare KEYEVENTF_UNICODE, e facendo kb.wVk = VK_BACKSPACE
?
(Inoltre, è possibile utilizzare Spy ++ per avere una migliore idea di cosa messaggi chiave vengono inviati all'applicazione di destinazione e come si differenzia da quando si colpisce un backspace letterale.)