Я использовал функцию 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 но пока не удалось решить проблему. Если кто-нибудь подскажет, как разрешить эту помощь. Благодарю.
Нет ... из документации: «Если член dwFlags указывает KEYEVENTF_UNICODE, wVk должно быть равно 0.» http://msdn.microsoft.com/en-us/library/ms646271(VS.85).aspx – HostileFork
Это сработало! Да для отправки символа Юникода я сохранил существующий код (т. Е. Kb.wVK = 0). Для других несимвольных клавиш, таких как backspace, я использовал kb.wVK = vk; и моя проблема решена. Спасибо всем за помощь :) – Mugunth
Обратите внимание на ссылку с документацией выше: если вы собираетесь установить wVk, вы должны удалить KEYEVENTF_UNICODE. Если игнорировать это работает для * you * on * вашей системы *, это может быть просто причуда или ошибка. Когда люди реализуют такие вещи, как эмулятор Wine, они идут по документации, и вы не делаете им службу, используя недокументированное поведение. Также Microsoft может опубликовать патч, который подводит подпрограмму к соблюдению и нарушает вашу программу. – HostileFork