Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/55: Рейтинг темы: голосов - 55, средняя оценка - 4.64
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30

Какой код у клавиши "тильда" для OnKeyDown

28.07.2011, 21:57. Показов 11319. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно отловить нажатие на клавишу "тильда" в событии OnKeyDown. Как её правильно вычислить? Понятно, что распечатав значение в событии я могу его взять для сравнения. Метод тыка показал, что этот код 192 (0xc0). В файле winuser.h по этому поводу сказано:

C++
1
#define VK_OEM_3          0xC0   // '`~' for US
Т.е., мягко говоря, тут ещё и от раскладки клавиатуры зависит. Как это по-человечески делается. В играх от Valve по тильде включается консолька и они наверняка делают это так, что для любой клавиатуры оно работает
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2011, 21:57
Ответы с готовыми решениями:

OnKeyDown + клавиши стрелок
Необходимо обработать нажатия клавиш стрелок. Form1.KeyPreview := True procedure TForm1.FormKeyDown(Sender: TObject; var Key:...

OnKeyDown реагирует только на одно нажатие клавиши
Есть у меня процедура, которая при нажатии на стрелку двигает картинку типа picture в конкретную сторону, но если зажать две стрелки, к...

Какой код клавиши FN в ноутбуках
Доброго, столкнулся с такой проблемой , делаю программу при сочетании клавиш FN+F1 но проблема в том, что FN в списке сишарпа нет, как мне...

26
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
29.07.2011, 05:35
все нормально. 192 это ж код физической клавиши.
американская раскладка распознает его как '~', русская как 'ё'
а сам код 192 он и в Африке останется 192)

тут сложней как раз обратная операция - придать нажатию на кнопку с кодом 192 смысл, то бишь, выяснить текущую раскладку, проверить CapsLock, нажат ли Shift и т.д.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.07.2011, 10:31  [ТС]
Т.е. правильным будет использовать макрос VK_OEM_3 вместо цифры 192?
0
 Аватар для SalterOk
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
29.07.2011, 12:43
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. правильным будет использовать макрос VK_OEM_3 вместо цифры 192?
а какая разница? Можно и цифру - если конечно вдруг не решат поменять значение. символьная константа более независимая
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.07.2011, 08:36  [ТС]
Цитата Сообщение от SalterOk Посмотреть сообщение
Можно и цифру
Всё-таки цифру я воспринимаю как некое черезжопие с точки зрения качества программирования

Добавлено через 3 минуты
Цитата Сообщение от AntonChik Посмотреть сообщение
все нормально. 192 это ж код физической клавиши.
американская раскладка распознает его как '~', русская как 'ё'
Я имел в виду НЕ языковую раскладку клавиатуры, а по сути дела модель физической клавиатуры. Ибо комментарий "for US" я воспринял как модель (при настройке линукса что-то ему раньше постоянно нужно было указать тип физической клавиатуры). Возможно, что в комментарии они и вправду имели ввиду раскладку, чтобы текстом обозначить, о какой клавише идёт речь

Добавлено через 19 часов 17 минут

-------------------------------------------------------------

Ещё вопрос. Теперь работа идёт с TEdit'ом.

В обработчике OnKeyDown код клавиши приходит в виде WORD со значением 192. В обработчике OnKeyPress код приходит в виде char'а и уже соответствует значению '~' (т.е. приходит код символа, а не код клавиши). Мне хочется отловить нажатие на тильду. Насколько я понимаю, из char'а уже код физической клавиши не получить

Почему использую именно OnKeyPress. Без всяких обработчиков нажатия получается так, что если на Edit'е в процессе работы программы нажать Enter, то раздаётся звук, который обычно сопровождает всякие ошибки. Если в OnKeyPress вставить проверку:

C++
1
2
if (Key == VK_RETURN)
  Key = 0;
то звук пропадает. Но в OnKeyDown такая проверка не помогает и звук раздаётся.

Вопрос. Мне нужно прибить звук при нажатии на enter и перехватить нажатие на клавишу тильда. Получается, что для этого нужно сделать одно из двух, только я не знаю как делаются оба этих пункта:
- в OnKeyPress получить код клавиши тильда, имея на руках лишь char
- научиться подавлять звук от enter'а
Предпочтительнее второе
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.07.2011, 18:23
C++
1
2
3
4
5
6
7
8
9
10
11
//---------------------------------------------------------------------------
void __fastcall TForm2::Memo1KeyPress(TObject *Sender, wchar_t &Key)
{
    if (Key == VK_RETURN) {
        Key = NULL;
        return; 
     }
     if (GetAsyncKeyState(VK_OEM_3)) {
            // твои действия с 'Ё', 'ё', '~', '`' и т.д. :-)
     }
}
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.07.2011, 18:32  [ТС]
Maluda, при использовании GetAsyncKeyState после нажатия тильды следующая нажатая клавиша куда-то теряется. Да и комбинировать VCL и WinAPI - как-то не совсем айс
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.07.2011, 18:38
Во-первых, VCL есть ни что иное как обёртка над WinApi,
во-вторых, код проверял, никакие символы никуда не пропадают,
создай пустой проект и проверь с этим кодом, на форму бросил Мемо
П.С. Проверял на CBuilder 2010, этой функцией пользуюсь очень часто,
глюков не замечал

C++
1
2
3
4
5
6
7
8
9
10
//---------------------------------------------------------------------------
void __fastcall TForm2::Memo1KeyPress(TObject *Sender, wchar_t &Key)
{
    if (GetAsyncKeyState(VK_OEM_3)) {
        this->Caption = this->Caption + "TILDA,";
    }
    else {
        this->Caption = this->Caption + Key + ",";
    }
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.07.2011, 23:29  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Во-первых, VCL есть ни что иное как обёртка над WinApi
Я в курсе, только уже не раз натыкался на то, что комбинируя их получается ересь, потому как когда что-то делаешь через winapi, то что-то не засветится через vcl, что засветилось бы, если бы пользовался интерфейсами Vcl'а

Добавлено через 3 минуты
На коротком примере не глючит. Значит где-то навелось
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.07.2011, 23:46
Ну и так, чтобы пофлудить на ночь глядя вот ещё вариации

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool bTildaPressed = false;
 
//---------------------------------------------------------------------------
void __fastcall TForm2::Memo1KeyDown(TObject *Sender, DWORD &Key, TShiftState Shift)
{
       if (Key == VK_OEM_3) bTildaPressed = true;        
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Memo1KeyPress(TObject *Sender, wchar_t &Key)
{
        if (bTildaPressed) {
               this->Caption = "My tilda Матильда has come! :-)";
        }        
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Memo1KeyUp(TObject *Sender, DWORD &Key, TShiftState Shift)
{
        if (Key == VK_OEM_3) bTildaPressed = false;
}
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.07.2011, 23:49  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Ну и так, чтобы пофлудить на ночь глядя вот ещё вариации
Хорошоее череж...е решение, ибо всё черезжопие локализовано и понятно. Я о таком не подумал

Если до кучи ещё расскажешь, что в OnKeyDown написать, чтобы при нажатии на enter звука не было, то будет ваще замечательно
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.07.2011, 23:50
Проблему Entera очень хорошо знаю. Отменить Enter можно только в TKeyPressEvent
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.07.2011, 23:51  [ТС]
Maluda, может ещё тут что-то умного сможешь сказать? Не работает OnKeyDown на форме fsMDIForm посты 7 и 9

Добавлено через 35 секунд
Цитата Сообщение от Maluda Посмотреть сообщение
Проблему Entera очень хорошо знаю. Отменить Enter можно только в TKeyPressEvent
Мне его не отменить надо, а по факту нажатия сделать то-то и то-то
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.07.2011, 23:53
У тебя по-любому другой контрол захватывает фокус, скорее всего это или TEdit или TMemo

Добавлено через 48 секунд
Форма не перехватывает фокус, если он в Edit'о образных контролах
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.07.2011, 23:55  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
У тебя по-любому другой контрол захватывает фокус, скорее всего это или TEdit или TMemo

Добавлено через 48 секунд
Форма не перехватывает фокус, если он в Edit'о образных контролах
Это ответ на который из вопросов?
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
30.07.2011, 23:56
Это про то, что в форме не работает OnKeyDown
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.07.2011, 23:59  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Это про то, что в форме не работает OnKeyDown
Если про оригинальную постановку вопроса (в первом посте той темы), то сие проявляется на пустом проекте (т.е. создать только форму и всё). Предложенный вариант через TApplicationEvents мне понравился. Там нажатие клавиши ловится нормально. Проблема только в том, как понять, что на текущий момент нажатие клавиши произошло в Edit'е

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
то сие проявляется на пустом проекте
Т.е. создаётся окно MDI-родитель и втыкается событие. Никаких Edit'ов, Memo'в нет. Просто хочется поймать нажатие клавиши в момент, когда не открыто ни одно из дочерних окон
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.07.2011, 00:05
Цитата Сообщение от Evg Посмотреть сообщение
Проблема только в том, как понять, что на текущий момент нажатие клавиши произошло в Edit'е
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::aplctnvnts1Message(tagMSG &Msg, bool &Handled) {
    switch (Msg.message) {
    case WM_KEYDOWN: {
            if (Msg.wParam == VK_OEM_3) {
                if (Msg.hwnd == Memo1->Handle) {
                    static int iTest = 0;
                    this->Caption = "Tilda on Memo1 was clicked " + AnsiString(iTest++);
                }
            }
 
        } break;
    }
}
П.С. Новая вариация родилась
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.07.2011, 00:12  [ТС]
Не, не то. В последнем посте я пояснял, что у меня куча окон и я не хочу каждый раз в этом учитывать новый контрол в одном из дочерних окон. Думал, что может каким-то макаром можно сделать общим способом.

Хотя я вижу, что в сообщении есть хэндл того контрола, на котором сейчас получено сообщение (Msg.hwnd). По хэнжлу как-то можно понять, что этот хэндл от объекта (окна) типа Edit?
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.07.2011, 00:19
В этом обработчике ты можешь получить любое событие, которое проходит в цикле сообщений
твоего приложения, от любого объекта, порождённого от TWinControl,
а это TButton, TEdit, TForm и т.д.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TForm1::aplctnvnts1Message(tagMSG &Msg, bool &Handled) {
        switch (Msg.message) {
        case WM_KEYDOWN: {
                        if (Msg.wParam == VK_OEM_3) {
                                if (Msg.hwnd == Memo1->Handle) {
                                        static int iTest = 0;
                                        this->Caption = "Tilda on Memo1 was clicked " + AnsiString(iTest++);
                                } else if (Msg.hwnd == Edit1->Handle) {
                                        static int iTest = 0;
                                        this->Caption = "Tilda on Edit1 was clicked " + AnsiString(iTest++);
                                } else if (Msg.hwnd == Form1->Handle) {
                                        static int iTest = 0;
                                        this->Caption = "Tilda on TForm1 was clicked " + AnsiString(iTest++);
                                }   
                        }
 
                } break;
        }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.07.2011, 00:19
Помогаю со студенческими работами здесь

Перегрузка оператора ~ (тильда) код внутри
Почему Так работает: public static string operator ~(MyClass obj) { string stringOfMassive=""; foreach...

прога, которая по нажатой клавише выводит ascii - код символа это клавиши или scan - код самой клавиши.
написать программу, которая по нажатой клавише выводит ascii - код символа этой клавиши или scan - код самой клавиши. осуществите вывод в...

Оператор тильда для binary
Здравствуйте, подскажите пожалуйста, зачем нужны вот эти две строчки: int8_t power = i2c_smbus_read_byte_data(fd, MPU_POWER1); ...

Конвертировать символ клавиши в код клавиши
Здравствуйте, в строку записан символ клавиши "тильда" в разных вариациях и при разных раскладках, а именно: string t1 = "`"; ...

Из OnKeyDown переопределить Key для OnKeyPress
Задача: при нажатии определенных клавиш на клавиатуре задать для ввода в Edit.Text определенный символ. При событии OnKeyDown в процедуре...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru