2010-03-10 2 views
0

Я использовал функцию sendinput() и крючки для клавиатуры Windows для разработки пользовательской клавиатуры для индийских языков. Проект находится в коде google здесь: http://code.google.com/p/ekalappaiНе удалось отправить ключ backspace с помощью :: SendInput() в приложение Wordpad

Ключ-манипулятор keyboad и функции sendinput помещаются в dll win32. И они вызваны из Qt exe. Наше приложение отлично работает для большинства клавиш и приложений. Я нахожу следующую проблему:

Я не мог отправить ключ Backspace в несколько приложений, таких как Wordpad/Openoffice/MsOffice. Я нахожу ту же проблему со стрелками и удаляет ключи.

Вот мой код:

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

Полный код DLL здесь: http://code.google.com/p/ekalappai/source/browse/trunk/ekhook/ekhook/dllmain.cpp

телефонный код:

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 

Полный код вызова от Qt Exe здесь: http://code.google.com/p/ekalappai/source/browse/trunk/ekalappai/window.cpp

Я пробовал искать в google но пока не удалось решить проблему. Если кто-нибудь подскажет, как разрешить эту помощь. Благодарю.

ответ

1

Вы смешиваете виртуальный ключ и код сканирования. Элемент wVk является важным, код сканирования будет использоваться только в том случае, если виртуальный ключ неоднозначен. Fix:

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

Нет ... из документации: «Если член dwFlags указывает KEYEVENTF_UNICODE, wVk должно быть равно 0.» http://msdn.microsoft.com/en-us/library/ms646271(VS.85).aspx – HostileFork

+0

Это сработало! Да для отправки символа Юникода я сохранил существующий код (т. Е. Kb.wVK = 0). Для других несимвольных клавиш, таких как backspace, я использовал kb.wVK = vk; и моя проблема решена. Спасибо всем за помощь :) – Mugunth

+0

Обратите внимание на ссылку с документацией выше: если вы собираетесь установить wVk, вы должны удалить KEYEVENTF_UNICODE. Если игнорировать это работает для * you * on * вашей системы *, это может быть просто причуда или ошибка. Когда люди реализуют такие вещи, как эмулятор Wine, они идут по документации, и вы не делаете им службу, используя недокументированное поведение. Также Microsoft может опубликовать патч, который подводит подпрограмму к соблюдению и нарушает вашу программу. – HostileFork

0

В документации сказано:

Если указан KEYEVENTF_UNICODE, SendInput посылает WM_KEYDOWN или WM_KEYUP сообщение для очереди сообщений переднего плана потока с wParam'а, равным VK_PACKET. Когда GetMessage или PeekMessage получат это сообщение, передача сообщения в TranslateMessage отправляет сообщение WM_CHAR с символом Unicode, первоначально указанным wScan.

Просто угадайте, но программы обработки текстов могут запускать поведение backspace с сообщений WM_KEYDOWN/WM_KEYUP, а не WM_CHAR. Таким образом, они могут ожидать VK_BACKSPACE (не VK_PACKET) в качестве wParam этих сообщений. Это может быть даже сделано с ускорителями на основе VKEY, а не с символами ... черт возьми, вы в Windows, так что практически все возможно. :)

Вы пытались не использовать KEYEVENTF_UNICODE и делать kb.wVk = VK_BACKSPACE? не

(Кроме того, вы можете использовать Spy ++, чтобы получить лучшую подсказку о том, что ключевые сообщения отправляются в целевое приложение, и как это отличается от того, когда вы попали в буквальном смысле забой.)

Смежные вопросы