Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Как очистить клавиатурный буфер?   Найти похожие ветки 

 
leonidus ©   (2005-10-17 23:46) [0]

После отправки из моей программы серии keybd_event у меня почему-то происходят ложные срабатывания при чтении состояния нажатых клавиш, в связи с чем возник вопрос, как мне после того как я поработаю с keybd_event за собой клавиатурный буфер почистить?


 
GanibalLector ©   (2005-10-18 01:41) [1]

SetKeyboardState ???


 
Leonid Troyanovsky ©   (2005-10-18 08:30) [2]


> leonidus ©   (17.10.05 23:46)  
> После отправки из моей программы серии keybd_event у меня
> почему-то происходят ложные срабатывания при чтении состояния
> нажатых клавиш, в связи с чем возник вопрос, как мне после



Похоже, что keybd_event используется неправильно.

--
Regards, LVT.


 
leonidus ©   (2005-10-18 18:54) [3]

Я по хоткею эмитирую нажатие 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`ов вызвать процедуру очистки юуфера клавиатуры и спать спокойно:)


 
leonidus ©   (2005-10-18 21:39) [4]

Подскажите пожалуйста.


 
Leonid Troyanovsky ©   (2005-10-19 09:29) [5]


> 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-19 17:59) [6]

>Вообще-то, для VK_CONTROL не нужен флаг KEYEVENTF_EXTENDEDKEY,
>если он, IMHO, не правый.
>А вот для эмуляции нажатия "C" также нужен  MapVirtualKey.

А как в таком случае должен выглядеть корректный код?


 
Leonid Troyanovsky ©   (2005-10-20 08:45) [7]


> 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.



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
14-1132824008
Сержо
2005-11-24 12:20
2005.12.18
JavaScript: Перенос опций из одного select а в другой


2-1133357898
JTAG
2005-11-30 16:38
2005.12.18
Еще вопросик как можно проверить существует ли вообще


14-1132121406
Суслик
2005-11-16 09:10
2005.12.18
Проблемы IDE


4-1129604342
Idx
2005-10-18 06:59
2005.12.18
Как добавить "LVS_..." style для ListView?


6-1125765758
Nekt0
2005-09-03 20:42
2005.12.18
SMTP Авторизация на mail.ru