Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/88: Рейтинг темы: голосов - 88, средняя оценка - 4.91
 Аватар для Dead_Messiah
8 / 8 / 2
Регистрация: 22.10.2010
Сообщений: 126

Привязка кнопки к клавише на клавиатуре

08.10.2013, 11:50. Показов 17923. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Дело обстоит так: есть форма с кнопками. Хочу сделать так, чтоб при нажатии определённой кнопки на клавиатуре нажималась кнопка на форме. Например, нажимаю на пробел и нажимается кнопка Button1.
Дело в том, что я искал информацию по этому, и находил примеры либо на делфи, либо на билдер. Примеры попадались однотипные, больше теоретические. А хотелось бы увидеть больше практики, желательно, подобную ситуацию, чтоб сделать по аналогии. Лично мне так материал лучше усваивается.
Пишу в 2010 студии, C++/CLI. Сильно не ругайте, пожалуйста, ибо не так уж и сильно продвинут в ООП.

Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.10.2013, 11:50
Ответы с готовыми решениями:

Информация о нажатой на клавиатуре клавише
Всем привет! Я только начинаю изучать язык C# и не очень еще понимаю, как решать некоторые задачи. Вот одна из них: Приложение,...

Привязка кнопки на форме к клавише на клавиатуре
Ребята, вы могли бы мне подробно объяснить как я могу привязать кнопку на форме к клавише на клавиатуре, чтобы нажатие кнопки на форме...

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

11
 Аватар для Dead_Messiah
8 / 8 / 2
Регистрация: 22.10.2010
Сообщений: 126
09.10.2013, 17:02  [ТС]
Как я понял, нажатие на кнопку описывается так:
C++
1
this->button1->click;
Но как сделать проверку на нажатие определённой клавиши?

Писал я в позапрошлом семестре программу на лабораторную, где нужно было работать с прерываниями клавиатуры, нужно было вывести скан и ASCII код нажатой клавиши. Там я сделал так:

C
1
2
3
4
5
6
7
8
9
while (code.c.ascii!=27)
    {   
       asm mov ah, 0x10
        asm int 0x16
        asm mov code.i, ax
        
        printf("Scan code: %x\n", code.c.scan);
        printf("Ascii code: %x\n",code.c.ascii);
    }
А вот с формами так не канает.
Разве никто не знает, как выкрутиться из этого положения?
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
10.10.2013, 11:04
Ну, для начала включи свойство keypreview в форме, а потом в обработчик формы KeyUp ставишь свой код проверки - какая клавиша нажата
0
 Аватар для Dead_Messiah
8 / 8 / 2
Регистрация: 22.10.2010
Сообщений: 126
10.10.2013, 11:19  [ТС]
KokosSPb, это да, я знаю и сделал. Меня интересует сам вот этот код проверки нажатой клавиши. Ибо консольные приёмы не работают.
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
10.10.2013, 15:03
if(e->KeyCode == Keys::A)
{

}
0
 Аватар для Dead_Messiah
8 / 8 / 2
Регистрация: 22.10.2010
Сообщений: 126
10.10.2013, 15:31  [ТС]
KokosSPb, теперь логические вопросы: что такое KeyCode? Откуда это всё? Из какой библиотеки?

И если я вот тупо вставлю вышенаписанный код, то при компиляции выдаёт

error C2039: KeyCode: не является членом "System::Windows::Forms::KeyPressEventAr gs"
1> c:\program files\reference assemblies\microsoft\framework\.netframe work\v4.0\system.windows.forms.dll: см. объявление "System::Windows::Forms::KeyPressEventAr gs"
error C3288: System::EventHandler ^: недопустимая отмена типа дескриптора
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
10.10.2013, 17:30
Мне только одно интересно, вот я ведь тебе написал KeyUp, при этом ты можешь взять KeyDown, но ты не будешь читать мануалы и выяснять что обозначает каждый из этих обработчиков и просто возьмешь KeyPress.
У KeyPress есть KeyChar, а не KeyCode, ну так, намек
0
 Аватар для Dead_Messiah
8 / 8 / 2
Регистрация: 22.10.2010
Сообщений: 126
10.10.2013, 17:42  [ТС]
KokosSPb, KeyUp/KeyDown - это когда клавиша нажимается/отпускается. Про KeyPress нашёл то, что оно вызывается только нажатием клавиш с символами. Мне это больше подходит. Та и если взять и Ваш код вставить в событие KeyUp, то всё равно возникает ошибка
error C3288: System::EventHandler ^: недопустимая отмена типа дескриптора
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
10.10.2013, 19:52
почему у меня работает?

C++
1
2
3
4
5
    private: System::Void Form1_KeyPress(System::Object^  sender, System::Windows::Forms::KeyPressEventArgs^  e) {
                 if(e->KeyChar == 'b'){
                     MessageBox::Show("b");
                 }
             }
Читай MSDN или хотя бы какого типа e->KeyChar
0
 Аватар для Dead_Messiah
8 / 8 / 2
Регистрация: 22.10.2010
Сообщений: 126
10.10.2013, 22:21  [ТС]
Честно говоря, без понятия, почему оно не работает :\

C++
1
2
3
4
5
6
7
private: System::Void Form1_KeyPress(System::Object^  sender, System::Windows::Forms::KeyPressEventArgs^  e) {
             if(e->KeyChar == 'p')
             {
                 this->button1->Click;
 
 
             };
С таким вариантом вообще целая куча ошибок.

1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(173): error C2059: синтаксическая ошибка: private
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(173): error C2143: синтаксическая ошибка: отсутствие ";" перед ":"
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(173): error C2059: синтаксическая ошибка: :
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(135): error C2039: Form1_KeyPress: не является членом "Music_total::Form1"
1> c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(30): см. объявление "Music_total::Form1"
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(135): error C2065: Form1_KeyPress: необъявленный идентификатор
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(135): error C3350: System::Windows::Forms::KeyPressEventHan dler: для конструктора делегата требуется 2 аргументов
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(176): error C2355: this: может указываться только в нестатических членах-функциях
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(176): error C2227: выражение слева от "->button1" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(176): error C2227: выражение слева от "->Click" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(182): error C2059: синтаксическая ошибка: }
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(182): error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
1>c:\users\isapgod\documents\visual studio 2010\projects\music_total\music_total\Fo rm1.h(182): error C2059: синтаксическая ошибка: }
1>Music_total.cpp(8): error C2337: STAThreadAttribute: атрибут не найден
1>Music_total.cpp(12): error C2653: Application: не является именем класса или пространства имен
1>Music_total.cpp(12): error C3861: EnableVisualStyles: идентификатор не найден
1>Music_total.cpp(13): error C2653: Application: не является именем класса или пространства имен
1>Music_total.cpp(13): error C3861: SetCompatibleTextRenderingDefault: идентификатор не найден
1>Music_total.cpp(16): error C2653: Application: не является именем класса или пространства имен
1>Music_total.cpp(16): error C2061: синтаксическая ошибка: идентификатор "Form1"
1>Music_total.cpp(16): error C3861: Run: идентификатор не найден
С обработчиком вот такое, а если убрать обработчик, то всё компилится нормально.
0
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
10.10.2013, 22:35
так проблема то в this->button1->Click; почитай как имитировать события

error C3728 , пытаюсь имитировать нажатие кнопки
пользуйся поиском
1
 Аватар для Dead_Messiah
8 / 8 / 2
Регистрация: 22.10.2010
Сообщений: 126
11.10.2013, 16:30  [ТС]
KokosSPb, огромное спасибо за помощь!

Всё оказалось гораздо проще, нежели думалось.
Вот как я решил свою ситуацию:

C++
1
2
3
4
 if (e->KeyCode == Keys::P)
    {
        button1->PerformClick();
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2013, 16:30
Помогаю со студенческими работами здесь

Перехватить клик по клавише на клавиатуре, когда окно не в фокусе
Здравствуйте, у меня Windows Form приложение. Мне нужно отловить клик по клавише Shift на клавиатуре, при этом мне нужно, чтобы это...

Привязка действия к клавише
Надо сделать так,что бы при нажатие на клавишу выполнялось некое действие(только 1 раз). Делаю так: procedure...

Привязка к клавиатуре
Всем привет! Народ , подскажите как можно кнопки 1,2,3 привязать к программе так , что б если нажималась 1 - происходила первая часть...

Привязка компонента Panel к клавиатуре
Собственно как привязать данный компонент Panel к клавиатуре? OnClick не помог

Привязка нажатия клавиши на клавиатуре к кнопке на странице
Здравствуйте! Есть аукцион в игре и можно ли через тамперманкей запустить скрипт который бы при нажатии на Enter активировал кнопку...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru