Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.015 c
2-1133337728
Igor_
2005-11-30 11:02
2005.12.18
Предобъявление классов в Object Pascal


3-1130748382
Sanich
2005-10-31 11:46
2005.12.18
Проблема спередачей параметров в функцию.


1-1132560985
GenieTM
2005-11-21 11:16
2005.12.18
Как получить текст из TDateTimePicker ( но не через DateTime!!)


2-1133527684
Не молодой
2005-12-02 15:48
2005.12.18
Удаление файла


14-1132988205
Snap
2005-11-26 09:56
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский