Не удалось отправить клавишу возврата с помощью :: SendInput () в приложение WordPad - PullRequest
0 голосов
/ 11 марта 2010

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

Перехват клавиатуры и функции sendinput помещены в win32 dll. И они вызываются из 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, но пока не смог найти решение. Если кто-нибудь имеет ключ к решению этой проблемы, пожалуйста, помогите. Благодаря.

Ответы [ 2 ]

1 голос
/ 11 марта 2010

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

kb.wVk   = vk;
kb.wScan = 0;   // TODO: look at VkKeyScanEx()
0 голосов
/ 11 марта 2010

Документация гласит:

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

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

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

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

...