Форум: "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.013 c