2013-09-14 2 views
8

Я работаю над виртуальной клавиатурой для окон. Я знаю, что могу генерировать события клавиатуры, используя (например) keybd_event() с правильным кодом виртуального ключа, но этот метод абсолютно непрактичен и не позволяет мне выводить (например) китайские или российские символы или, по крайней мере, не легко ,Излучение ввода клавиатуры с использованием сообщения WM_CHAR?

Возможно ли, в окнах, имитировать событие клавиатуры, отправив сообщение WM_CHAR? Это было бы идеально, если бы я мог это сделать, потому что мне просто нужно было бы получить код char из кодированного файла конфигурации UTF-8 или UTF-16 и отправить сообщение.

Если возможно, как я могу это сделать в Windows CE и Windows Mobile? Мне нужно поддерживать как настольные, так и мобильные устройства.

Благодарим за помощь! :)

+3

ли ручная помощь ты? http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304(v=vs.85).aspx * Эта функция была заменена. Вместо этого используйте SendInput. * –

+2

Примечание. Если вы хотите имитировать * клавиатуру *, вы хотите имитировать * keypresses * (и релизы), для чего требуется отправить «коды виртуальных ключей». Каждый * Виртуальный ключ * напрямую соответствует ключу на вашей физической клавиатуре * и НЕ конкретному символу *. Это не то же самое, что имитировать * характер ввода *, который будет иметь дело с 'WM_CHAR'. Коды Virutal Key переводится в сообщения 'WM_CHAR' по окнам (' TranslateMessage') в соответствии с настроенным языком и макетом клавиатуры. – dialer

+1

http://blogs.msdn.com/b/oldnewthing/archive/2005/05/30/423202.aspx – jamesdlin

ответ

2

Код демонирования как имитировать клавиатуру для юникода. Осторожно:

  1. необходимо активировать целевое приложение, так как события клавиатуры в очереди к активному приложению ...
  2. целевого приложение должно быть юникод известен
#include <Windows.h> 
#include <tchar.h> 

static void send_unicode(wchar_t ch) { 
    INPUT input; 

    // init 
    input.type = INPUT_KEYBOARD; 
    input.ki.time = 0; 
    input.ki.dwExtraInfo = 0; 
    input.ki.wVk = 0; 
    input.ki.dwFlags = KEYEVENTF_UNICODE; 
    input.ki.wScan = ch; 

    // down 
    SendInput(1, &input, sizeof(INPUT)); 

    // up 
    input.ki.dwFlags |= KEYEVENTF_KEYUP; 
    SendInput(1, &input, sizeof(INPUT)); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    _tprintf(TEXT("you have 5 seconds to switch to an application which accepts unicode input (as Word)...\n")); 
    Sleep(5000); 
    _tprintf(TEXT("Sending...\n")); 
    send_unicode(946); // lowercase greek beta 
    send_unicode(269); // lowercase c-hachek 
    send_unicode(12449); // japanese katakana small a 
    send_unicode(4595); // korean hangul jongseong phieuph-pieup 

    return 0; 

} 

+0

Посмотрите на это, спасибо. – Virus721

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