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.

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top