Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обработка событий клавиатуры / 12 сообщений из 12, страница 1 из 1
11.04.2013, 18:37
    #38222561
dymal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
Доброго времени суток!

Возник вопрос: как можно реализовать на C# следующее действие.

При нажатии на клавишу на клавиатуре записать информацию в буфер, а потом, с некоторой задержкой, передать в форму для дальнейшей обработки.

Пробовал в форме переопределять WndProc. Сохранять в буфере сообщение. Потом планировал сообщение передать методу base.WndProc. Но этот способ у меня не заработал после добавления TextBox на форму по той причине, что в WndProc не попадают сообщения клавиатуры.

Если отлавливать нажатия/отпускания клавиш в обработчике события WM_KEYDOWN/WM_KEYUP. Но в этом случае не знаю как передать сообщение после задержки так, чтобы программа не зациклилась.

Подскажите как довести до ума какой-нибудь из этих способов или предложите свой.

Подобное на Delphi реализовывал, но мне нужно это сделать на C#

Заранее благодарен
...
Рейтинг: 0 / 0
11.04.2013, 23:03
    #38222768
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
Лучший способ - почитать MSDN о событиях клавиатуры
...
Рейтинг: 0 / 0
12.04.2013, 04:43
    #38222850
dymal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
Cat2, если делать по первому варианту, то я не нашел способа чтобы события клавиатуры попадали в WndProc. Пробовал устанавливать свойство KeyPreview = true, события клавиатуры все равно не попадают в эту процедуру (это только после добавления компонентов на форму, если на форме нет компонентов, то события приходят).

Если рассматривать второй вариант , то как мне отправить нажатие на клавишу в форму? Если посылать сообщение WM_KEYDOWN или вызывать SendKeys.SendWait() то как потом в обработчике определить: нажата физическая клавиша или это эмуляция нажатия.

Сделал пока так: на время отправки эмулированного нажатия устанавливаю флаг. И в обработчике события анализирую: если флаг поднят, то пропустить это событие, не записывая в буфер. Но в этом случае есть вероятность (хоть и очень маленькая) того, что в то время, как будет поднят флаг пользователь нажмет на клавишу.
...
Рейтинг: 0 / 0
12.04.2013, 07:54
    #38222891
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
Хосподя, для эстонцев штоли прогу пишут, а то они не успевают за клавишами.
...
Рейтинг: 0 / 0
12.04.2013, 13:07
    #38223359
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
                  //сделать что-то
                  .......
                  Thread.Sleep(1000);
                  //сделать еще что-то
                  .......

        }
...
Рейтинг: 0 / 0
12.04.2013, 14:38
    #38223523
dymal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
Pallaris, спасибо за подсказку, но этот вариант мне не подходит, так как на время этой задержки Форма будет "зависшей", так как не будут обрабатываться другие сообщения. Вот мне необходимо реализовать ИМЕННО через буфер.

В исходной задаче я не написал, что решение о том следует ли эмулировать нажатия клавиш из буфера принимается при принятии следующего события клавиатуры. Поэтому мне нужна реализация именно через буфер.
...
Рейтинг: 0 / 0
12.04.2013, 14:47
    #38223541
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
dymalPallaris, спасибо за подсказку, но этот вариант мне не подходит, так как на время этой задержки Форма будет "зависшей", так как не будут обрабатываться другие сообщения.

Выполните первую часть действий, запустите таймер. В событии timer_elapsed выполните вторую часть действий.
...
Рейтинг: 0 / 0
12.04.2013, 18:22
    #38223968
dymal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
Pallaris, я пытаюсь рассказать, что у меня не возникло проблем с тем КОГДА запускать второе действие. Вопрос в том как выполнить второе действие?
...
Рейтинг: 0 / 0
12.04.2013, 21:42
    #38224116
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
А что во втором действии надо сделать?
Пока я думаю что-то типа RunVtoroeDeystvie();
...
Рейтинг: 0 / 0
13.04.2013, 17:24
    #38224467
dymal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
Pallaris, второе действие должно отправить сообщение на обработку контроллам формы. Причем это нужно сделать так, чтобы нажатие клавиши не попало в буфер.
Напомню: ПЕРВОЕ ДЕЙСТВИЕ: при нажатии клавиши сообщение попадает в буфер и не передается дальше на обработку контроллам формы. Затем запускается таймер на N миллисекунд. При прошествии этих N миллисекунд мне необходимо выполнить ВТОРОЕ ДЕЙСТВИЕ: обработать это сообщение клавиатуры (или не обработать в зависимости от некоторого условия). Обработка заключается в стандартной диспетчеризации событий - в контроллы.
...
Рейтинг: 0 / 0
13.04.2013, 18:15
    #38224512
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
dymal,
Почему бы все это не материализовать через WndProc, и делегат с пулом потоков?
зы имхо как будущий пользователь ваше программы, хочу предостеречь от "комплиментов" создателю
...
Рейтинг: 0 / 0
13.04.2013, 19:12
    #38224546
dymal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка событий клавиатуры
Где-то в степи, в своем первом посте я писал, что я пробовал реализовать свою задачу через WndProc, но у меня появилась проблема - при добавлении контроллов на форму в WndProc перестали поступать сообщения от клавиатуры, хотя устанавливал Form.KeyPrewiew = true.
По поводу пула потоков: я не вижу ему здесь применения. Если не сложно - опишите ваш вариант.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обработка событий клавиатуры / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]