Главная страница
    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.012 c
2-1133260791
nickmas
2005-11-29 13:39
2005.12.18
Компонент TabControl


1-1131827370
Manufel
2005-11-12 23:29
2005.12.18
Запись элементов очень большого масива в файл с макс скоростью


14-1132859236
Вероника
2005-11-24 22:07
2005.12.18
книги


2-1133129521
Diatel
2005-11-28 01:12
2005.12.18
Как сделать аналог дизассемблера IDA.


2-1133357898
JTAG
2005-11-30 16:38
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский