Главная страница
    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.46 MB
Время: 0.012 c
2-1133283723
BlacK_DiamonD
2005-11-29 20:02
2005.12.18
События папки


14-1132842156
oldman
2005-11-24 17:22
2005.12.18
Нашелся один динозавр... :)


3-1130845900
Андрей Жук
2005-11-01 14:51
2005.12.18
Вставка выборки (Oracle)


1-1132321580
Developerr
2005-11-18 16:46
2005.12.18
Перемещение TPanel за курсором мышки влеов и вправо


14-1133179570
Fl@sh
2005-11-28 15:06
2005.12.18
Выбор джойстика





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский