|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
Доброго времени суток! Возник вопрос: как можно реализовать на C# следующее действие. При нажатии на клавишу на клавиатуре записать информацию в буфер, а потом, с некоторой задержкой, передать в форму для дальнейшей обработки. Пробовал в форме переопределять WndProc. Сохранять в буфере сообщение. Потом планировал сообщение передать методу base.WndProc. Но этот способ у меня не заработал после добавления TextBox на форму по той причине, что в WndProc не попадают сообщения клавиатуры. Если отлавливать нажатия/отпускания клавиш в обработчике события WM_KEYDOWN/WM_KEYUP. Но в этом случае не знаю как передать сообщение после задержки так, чтобы программа не зациклилась. Подскажите как довести до ума какой-нибудь из этих способов или предложите свой. Подобное на Delphi реализовывал, но мне нужно это сделать на C# Заранее благодарен ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 18:37 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
Лучший способ - почитать MSDN о событиях клавиатуры ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 23:03 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
Cat2, если делать по первому варианту, то я не нашел способа чтобы события клавиатуры попадали в WndProc. Пробовал устанавливать свойство KeyPreview = true, события клавиатуры все равно не попадают в эту процедуру (это только после добавления компонентов на форму, если на форме нет компонентов, то события приходят). Если рассматривать второй вариант , то как мне отправить нажатие на клавишу в форму? Если посылать сообщение WM_KEYDOWN или вызывать SendKeys.SendWait() то как потом в обработчике определить: нажата физическая клавиша или это эмуляция нажатия. Сделал пока так: на время отправки эмулированного нажатия устанавливаю флаг. И в обработчике события анализирую: если флаг поднят, то пропустить это событие, не записывая в буфер. Но в этом случае есть вероятность (хоть и очень маленькая) того, что в то время, как будет поднят флаг пользователь нажмет на клавишу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 04:43 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
Хосподя, для эстонцев штоли прогу пишут, а то они не успевают за клавишами. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 07:54 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 13:07 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
Pallaris, спасибо за подсказку, но этот вариант мне не подходит, так как на время этой задержки Форма будет "зависшей", так как не будут обрабатываться другие сообщения. Вот мне необходимо реализовать ИМЕННО через буфер. В исходной задаче я не написал, что решение о том следует ли эмулировать нажатия клавиш из буфера принимается при принятии следующего события клавиатуры. Поэтому мне нужна реализация именно через буфер. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 14:38 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
dymalPallaris, спасибо за подсказку, но этот вариант мне не подходит, так как на время этой задержки Форма будет "зависшей", так как не будут обрабатываться другие сообщения. Выполните первую часть действий, запустите таймер. В событии timer_elapsed выполните вторую часть действий. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 14:47 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
Pallaris, я пытаюсь рассказать, что у меня не возникло проблем с тем КОГДА запускать второе действие. Вопрос в том как выполнить второе действие? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 18:22 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
А что во втором действии надо сделать? Пока я думаю что-то типа RunVtoroeDeystvie(); ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 21:42 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
Pallaris, второе действие должно отправить сообщение на обработку контроллам формы. Причем это нужно сделать так, чтобы нажатие клавиши не попало в буфер. Напомню: ПЕРВОЕ ДЕЙСТВИЕ: при нажатии клавиши сообщение попадает в буфер и не передается дальше на обработку контроллам формы. Затем запускается таймер на N миллисекунд. При прошествии этих N миллисекунд мне необходимо выполнить ВТОРОЕ ДЕЙСТВИЕ: обработать это сообщение клавиатуры (или не обработать в зависимости от некоторого условия). Обработка заключается в стандартной диспетчеризации событий - в контроллы. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2013, 17:24 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
dymal, Почему бы все это не материализовать через WndProc, и делегат с пулом потоков? зы имхо как будущий пользователь ваше программы, хочу предостеречь от "комплиментов" создателю ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2013, 18:15 |
|
Обработка событий клавиатуры
|
|||
---|---|---|---|
#18+
Где-то в степи, в своем первом посте я писал, что я пробовал реализовать свою задачу через WndProc, но у меня появилась проблема - при добавлении контроллов на форму в WndProc перестали поступать сообщения от клавиатуры, хотя устанавливал Form.KeyPrewiew = true. По поводу пула потоков: я не вижу ему здесь применения. Если не сложно - опишите ваш вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2013, 19:12 |
|
|
start [/forum/topic.php?fid=20&msg=38222850&tid=1404847]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 175ms |
0 / 0 |