| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Обработать Ctrl+1 |
| Автор: Akella 21.11.2007, 10:07 | ||||
Есть код, который срабатывает при нажатии на Enter или Shift+Enter
Код этот нормально работает. Так вот, на примере его я хочу отлавливать нажатие Ctrl+1, Ctrl+2 ... Ctrl+6
Но код не срабатывает. Может есть у кого пример? |
| Автор: pseud 21.11.2007, 10:13 | ||
| видимо кто-то перехватывает раньше и не передает сюда быстрое решение: использовать OnKeyUp работает
можно Shift использовать вместо GetKeyState |
| Автор: Alexeis 21.11.2007, 10:19 | ||
|
| Автор: Akella 21.11.2007, 10:27 |
| Та так знаю, но слишком просто, а настоящие герои всегда идут в обход. Добавлено через 40 секунд |
| Автор: Snowy 21.11.2007, 11:25 |
| Ну может у тебя где-то хоткей такой прописан. Он срабатывает и дальше не пускает. |
| Автор: Akella 21.11.2007, 11:34 | ||
нет, Ctrl+1 нигде не прописан
дебаггер останавливается на первой строчке, а if GetKeyState(... пропускает, всмысле перепрыгивает Добавлено через 1 минуту и 23 секунды Ну я сделал через KeyDown, т.е. проблема как бы решена. Но через KeyPress так и не смог. Спасибо, всем |
| Автор: Akella 21.11.2007, 12:19 | ||
а как же это? Ord('1') Добавлено через 1 минуту и 5 секунд
тем не менее, как видно из примера, можно и Shift обрабатывать и F1 думаю, что тоже |
| Автор: ama_kid 21.11.2007, 12:31 |
| Ord('1') - это код символа, соответствующего нажатию просто клавиши '1' - в любом редакторе эта клавиша выдаст этот символ... А вот Ctrl+1 нигде никакого символа не напишет - это типа какая-нить "управляющая комбинация" и OnKeyPress, по идее, не должен генерироваться, что кстати и подтвержается у меня опытом (но вокруг меня только ноутбуки и я не уверен, что аналогично происходит на десктопе)... голый Shift OnKeyPress не генерит, а вот Shift+a - генерит (большая буква А), поэтому конечно можно... Насчет F1 - есть сомнения... |
| Автор: pseud 21.11.2007, 12:34 |
зря а теперь попробуй нажать Ctrl+1 и не отпускать и сколько раз у тебя ето все дело выполнится? ну сколько успеет, во всяком случае больше одного а вот с KeyPress и KeyUp - только один |
| Автор: Akella 21.11.2007, 14:07 | ||||||
ну дык... это сочетание клавишь, а кодов сочетаний нет как таковых Добавлено через 2 минуты и 4 секунды
та отож :( Добавлено через 3 минуты и 51 секунду
по нажатию на Ctrl не генерируется, а вот по нажатию на 1 генерируется, и вот здесь ты уже проверяешь, держит ли юзер Ctrl или Alt или Shift Добавлено через 4 минуты и 47 секунд Т.е. по твоим убеждениям
неработоспособен |
| Автор: ama_kid 21.11.2007, 14:32 |
| Akella, в отличие от Ctrl+1 - Enter генерирует ASCII символ (перевод строки), поэтому данный код жизнеспособен и правилен... по моим убеждениям неработоспособной является проверка Ctrl+1 в обработчике OnKeyPress, ибо эту комбинацию нельзя отловить в принципе в данном обработчике (опять же, по моим убеждениям) т.к. ASCII-символ не генерится (ты можешь спокойно проверять это все дело в обработчиках OnKeyUp\Down, ибо туда приходят уже все нажатия любых клавиш, что собсно в итоге ты и сделал, но не все комбинации вызывают OnKeyPress, а только те, которые генерят ASCII-символы)... Поэтому меня и удивило, что ты http://forum.vingrad.ru/index.php?showtopic=182989&view=findpost&p=1322913 написал, что у тебя "дебаггер останавливается...", хотя по идее - обработчик не должен был вообще срабатывать (у меня не срабатывает)... Вот у меня и возник вопрос - какому ASCII символу соответствует данная комбинация, если у тебя вызвалось событие OnKeyPress при нажатии Ctrl+1?... Или я что-то не так понял? |
| Автор: Akella 21.11.2007, 15:11 | ||
а цифирЯ "1", значит-с, не генерирует? Добавлено через 1 минуту и 34 секунды см. обведенное красным ![]() Добавлено через 3 минуты и 41 секунду а ты сам попробуй Добавлено через 5 минут и 23 секунды клавиша 1 нажата??????? НАЖАТА!!!! значит происходит OnKeyPress, значит эта строка выполнится:
Добавлено через 6 минут и 8 секунд а дальше проверяем нажата ли Ctrl, вот у меня именно с этим проблемы, с определением нажата ли ctrl, в одном примере работает, а в другом нет |
| Автор: ama_kid 21.11.2007, 16:07 | ||
Блин, я видимо никак не могу донести свою мысль... Ладно, продемонстрирую на примере свою линию размышления. Вызов OnKeyPress является ответом на приход сообщения WM_CHAR (в исходниках VCL - это файл Controls.pas строки 7098-7126 для Delphi 7). Дальше, я создаю новый пустой проект и перекрываю это сообщение следующим образом:
Запускаю, появляется пустая форма... Нажимаю просто одну клавишу '1'. Вылезает ShowMessage c надписью '49' (ASCII-код символа '1'). Это все понятно. Но вот нажимаю Ctrl+1 - не вылезает вообще никакого сообщения - это значит, что WM_CHAR не приходит, следовательно никакого OnKeyPress не должно быть... (Про WM_KEYUP\WM_KEYDOWN в данном случае я вообще ничего не говорю - они приходят исправно)... И я просто не могу понять, почему тебе приходит WM_CHAR при нажатии на Ctrl+1 (раз обработчик срабатывает), а у меня нет? |
| Автор: Akella 21.11.2007, 16:32 |
зачем его прекрывать? я и не говорил ни разу здесь о перекрытии Добавлено через 40 секунд ты создай пустой проект без всяких перекрытий |
| Автор: ama_kid 21.11.2007, 16:38 | ||
Для того, чтобы отловить WM_CHAR на самом раннем этапе. Изначально я и говорил, что в случае:
|
| Автор: pseud 21.11.2007, 17:39 | ||
я создал пустой проект написал:
так вот если нажать "1", то я сюда попадаю а если нажать "1", удерживая Ctrl - фига_с_два - не попадаю |
| Автор: Akella 21.11.2007, 17:48 |
| блин, доигрался, теперь и у меня не выскакивает |
| Автор: Akella 21.11.2007, 18:21 | ||
но этот код работает на ура и даже Shift+Enter
Добавлено через 9 минут и 26 секунд значит и c Ctrl тоже болжно по идее работать |
| Автор: ama_kid 21.11.2007, 18:41 |
| Опять по второму кругу? P.S. Про Enter - я уже говорил - он генерирует печатный символ... |