Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как очистить клавиатурный буфер? [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 ???


Наверх

Титульная страница Поиск, карта сайта Написать письмо