![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как очистить клавиатурный буфер? [D6, WinXP]
leonidus © (2005-10-17 23:46:00)После отправки из моей программы серии keybd_event у меня почему-то происходят ложные срабатывания при чтении состояния нажатых клавиш, в связи с чем возник вопрос, как мне после того как я поработаю с keybd_event за собой клавиатурный буфер почистить?
Leonid Troyanovsky (2005-10-20 08:45:00) [1]
> leonidus © (19.10.05 17:59) [6]
> >А вот для эмуляции нажатия 'C' также нужен MapVirtualKey.
> А как в таком случае должен выглядеть корректный код?
Ну, я бы сделал примерно так:
keybd_event(vk_control, MapVirtualKey(vk_control,0), 0, 0);
keybd_event(Ord('C'), MapVirtualKey(Ord('C'),0), 0, 0);
keybd_event(Ord('C'), MapVirtualKey(Ord('C'),0), KEYEVENTF_KEYUP, 0);
keybd_event(vk_control, MapVirtualKey(vk_control,0), KEYEVENTF_KEYUP, 0);
или SendInput, RTFM.
Для ожидания окончания обработки испытал бы
WaitForInputIdle(hprocess, INFINITE);
где hprocess := OpenProcess для pid из GetWindowThreadProcessId,
полученного по хендлу контрола.
--
Regards, LVT.
leonidus (2005-10-19 17:59:00) [2]>Вообще-то, для VK_CONTROL не нужен флаг KEYEVENTF_EXTENDEDKEY,
>если он, IMHO, не правый.
>А вот для эмуляции нажатия 'C' также нужен MapVirtualKey.
А как в таком случае должен выглядеть корректный код?
Leonid Troyanovsky (2005-10-19 09:29:00) [3]
> leonidus © (18.10.05 18:54) [3]
> Я по хоткею эмитирую нажатие Ctrl+C для копирование в буфер
> выделенного в любом приложении текста:
>
> keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,
> 0),KEYEVENTF_EXTENDEDKEY,0);
Вообще-то, для VK_CONTROL не нужен флаг KEYEVENTF_EXTENDEDKEY,
если он, IMHO, не правый.
А вот для эмуляции нажатия 'C' также нужен MapVirtualKey.
К проблеме технического характера надо отнести то обстоятельство,
что для обработки нажатий клавиш чужому приложению нужно время.
Т.е., "нажимающее" приложение должно дождаться окончания
обработки. Самый простой способ - подобрать некий Sleep (хотя более
правильный это, наверное, делать WaitForInputIdle чужого процесса).
Можно попробывать немного другой путь:
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/e8115e50b604ca90
где синхронизация с обработкой в другом процессе происходит за счет
SendMessage. Кстати, обрати внимание на сказанное про WM_COPY.
Ну, и нельзя не сказать о порочности такой методики, использующей
буфер обмена. Т.е., в любом случае, это нельзя делать без ведома юзера.
--
Regards, LVT.
leonidus (2005-10-18 21:39:00) [4]Подскажите пожалуйста.
leonidus (2005-10-18 18:54:00) [5]Я по хоткею эмитирую нажатие Ctrl+C для копирование в буфер выделенного в любом приложении текста:
keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_EXTENDEDKEY,0);
keybd_event(Ord('C'),0,0,0);
keybd_event(Ord('C'),0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY,0);
после чего моя программа читает буфер что бы получить это слово. так вот в хоткей по которому происходит эмитация нажатия нажатие - это Ctrl, в результате не знаю почему но иногда после эмитации Ctrl+C программа как бы самомпроизвольно уже без юзера сама "нажимает" клавишу Ctrl. Я может не очень понятно объсняю просто если просто программа перехватывает нажатие на хоткей (Ctrl) то она это делает очень четко, а вот как только после нажатия хоткея я эмитирую нажатие Ctrl+C, тут начинаются глюки когда эмитация Ctrl+C происходит два или три раза, т.е. как будто хоткей был нажат не один раз а несколько. Поэтому что бы быть уверенным я хотел бы после всех этих keybd_event`ов вызвать процедуру очистки юуфера клавиатуры и спать спокойно:)
Leonid Troyanovsky (2005-10-18 08:30:00) [6]
> leonidus © (17.10.05 23:46)
> После отправки из моей программы серии keybd_event у меня
> почему-то происходят ложные срабатывания при чтении состояния
> нажатых клавиш, в связи с чем возник вопрос, как мне после
Похоже, что keybd_event используется неправильно.
--
Regards, LVT.
GanibalLector (2005-10-18 01:41:00) [7]SetKeyboardState ???