Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
12 / 12 / 3
Регистрация: 11.10.2010
Сообщений: 159
1

Перехват нажатия клавишь

25.06.2011, 03:06. Показов 2752. Ответов 19
Метки нет (Все метки)

Всем доброго времени суток!!!! Написал программку для работы, с помощью которой можно проигрывать звук, видео и в поле мемо писать текст.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
if (Key == VK_NUMPAD5) {
VideoGrabber2->PausePlayer();
}
if (Key == VK_NUMPAD6) {
VideoGrabber2->RunPlayer();
 
}
 
if (Key == VK_NUMPAD4) {
VideoGrabber2->RunPlayerBackwards();
 
}
 
if (Key == VK_NUMPAD2) {
BASS_ChannelPause(chan);
}
if (Key == VK_NUMPAD3) {
int pos;
int size_p;
int size_p1;
int min;
min = 300000;
size_p1=BASS_ChannelGetPosition(chan,BASS_POS_BYTE);
pos=((size_p1)+min);
BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE);
BASS_ChannelPlay(chan,FALSE);
}
 
if (Key == VK_NUMPAD1) {
int pos;
int size_p;
int size_p1;
int min;
min = 300000;
size_p1=BASS_ChannelGetPosition(chan,BASS_POS_BYTE);
pos=((size_p1)-min);
BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE);
BASS_ChannelPlay(chan,FALSE);
}
}
Для удобства паузу, вперед, назад, стоп вынес на NUM(456123). Как сделать так чтоб при нажатии на эти клавиши в поле мемо не писались цифры.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2011, 03:06
Ответы с готовыми решениями:

Перехват нажатия.......
Народ, надо написать код перехвата нажатия стандартных кнопок формы (минимизировать,...

Перехват нажатия клавиши в XP
Здравствуйте Все! Операционная среда - XP, инструмент C++ Builder 6. По нажатию кнопки в цикле...

Перехват нажатия клавиш.
Помогите новичку в программировании, если не трудно. Есть задача: по нажатию клавиш (например F1 -...

Перехват нажатия кнопок мышки.
Кто может скинуть или написать программу которая считала бы нажатие левой клавиши мыши? Я начал...

19
Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
25.06.2011, 03:36 2
serg87i,

Что ты подрозумываеш под:

Цитата Сообщение от serg87i Посмотреть сообщение
проигрывать звук, видео и в поле мемо писать текст.
1
LK
Заблокирован
25.06.2011, 04:12 3
Как сделать так чтоб при нажатии на эти клавиши в поле мемо не писались цифры.
для этого достаточно убрать фокус с мемо.
Цитата Сообщение от Programmer. Посмотреть сообщение
serg87i,
Что ты подрозумываеш под:
это программа для написания анонимок под музыку, уважаемый Programmer..
1
12 / 12 / 3
Регистрация: 11.10.2010
Сообщений: 159
25.06.2011, 08:42  [ТС] 4
Спасибо за совет! Все работает только сперва в мемо выводится цифра а потом уже срабатывает фокус. Как сделать так чтоб цыфра не отображалась?
0
LK
Заблокирован
25.06.2011, 10:34 5
вырабатывайте в себе привычку показывать используемый вами код .
и не будет большого неудобства, если вы повесите управление проигрывателем на две клавиши, например, так:
C++
1
if (Key == VK_CONTROL && Key == VK_NUMPAD5) {...}
и т.д., избежав таким ввода в мемо.
2
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
25.06.2011, 10:36 6
Цитата Сообщение от LK Посмотреть сообщение
Как сделать так чтоб при нажатии на эти клавиши в поле мемо не писались цифры.
Для мемо и формы установить вот такой обработчик OnKeyPress

C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::FormKeyPress(TObject *Sender, wchar_t &Key)
{
        if (Key == VK_NUMPAD5) {
                 VideoGrabber2->PausePlayer();
                 // это поможет
                 Key = NULL;
                return;
        }
 
        // и т.д. в таком же духе
         
}
1
LK
Заблокирован
25.06.2011, 10:56 7
не помогло
1
Миниатюры
Перехват нажатия клавишь  
12 / 12 / 3
Регистрация: 11.10.2010
Сообщений: 159
25.06.2011, 12:54  [ТС] 8
Цитата Сообщение от LK Посмотреть сообщение
вырабатывайте в себе привычку показывать используемый вами код .
и не будет большого неудобства, если вы повесите управление проигрывателем на две клавиши, например, так:
C++
1
if (Key == VK_CONTROL && Key == VK_NUMPAD5) {...}
и т.д., избежав таким ввода в мемо.
Согласен. Но это причинит неудобство обработчику текста так как нужно будет давить еще и на клавишу ctrl
0
LK
Заблокирован
25.06.2011, 13:26 9
имхо, гораздо бОльшее неудобство - лишать пользователя возможности использовать цифровую клавиатуру по ее прямому назначению - для ввода цифр - то, что вы ее в таком качестве использовать не привыкли, вовсе не означает, что и миллионы других пользователей тоже от нее отказались - не задумывались ? а сочетания клавиш для того и есть, чтобы не лишать основные клавиши их непосредственного предназначения - ввода определенного символа.

З.Ы. На специализированном , в данном случае - программистском, форуме необходимо следить за своими выражениями, например, под "обработчиком текста" вы имеете ввиду , насколько я понимаю, человека , который вводит текст в мемо, в то же время, программист воспринимает это выражение совсем по другому .
0
Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
25.06.2011, 13:38 10
LK,

Не по теме:

пожалуйсто подскажи как ты ето сделал в настроиках?


http://a.pix.ge/t/gznnj.jpg
0
LK
Заблокирован
25.06.2011, 14:28 11
Programmer., это эксперт - дополнения к Билдеру, устанавливается отдельно, Описание CnPack Wizards, я всегда качаю последнюю версию , так называемую Unstable, почему она обозвана нестабильной, я так и не понял.

Да, есть еще GExperts, тоже интересная вещь: GExperts: Помощник для Delphi
2
Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
25.06.2011, 14:46 12
LK,
Спасибо болшое я тоже CnPack Wizard Unstable качаю, а как именно его исползовать
1
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
25.06.2011, 15:00 13
LK, во-первых читай внимательно!

Цитата Сообщение от Maluda Посмотреть сообщение
Для мемо и формы установить вот такой обработчик OnKeyPress
Это значит
C++
1
Memo1->OnKeyPress = &Form1->OnKeyPress;
Во-вторых, при нажатии на клавишу VK_NUMPAD5 (при выключенном NumLock),
в Мемо итак никакие символы не печатаются!!!

А 5 печатается у тебя тогда, когда включен NumLock и в этом случае,
у тебя уже wchar_t Key == '5', а не VK_NUMPAD5

'5' - 0x35
VK_NUMPAD5 - 0x65
1
Прогер
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
25.06.2011, 15:11 14
LK,
Спаисо! разобрался
0
LK
Заблокирован
25.06.2011, 16:08 15
интересно было бы посмотреть на судорожно дергающегося при включении и выключении дополнительной клавиатуры "оператора текста" , будто проникшегося при этом Invisible Connections Вангелиса , а может и правда - проникшегося ?..
2
12 / 12 / 3
Регистрация: 11.10.2010
Сообщений: 159
26.06.2011, 01:10  [ТС] 16
Цитата Сообщение от LK Посмотреть сообщение
имхо, гораздо бОльшее неудобство - лишать пользователя возможности использовать цифровую клавиатуру по ее прямому назначению - для ввода цифр - то, что вы ее в таком качестве использовать не привыкли, вовсе не означает, что и миллионы других пользователей тоже от нее отказались - не задумывались ? а сочетания клавиш для того и есть, чтобы не лишать основные клавиши их непосредственного предназначения - ввода определенного символа.

З.Ы. На специализированном , в данном случае - программистском, форуме необходимо следить за своими выражениями, например, под "обработчиком текста" вы имеете ввиду , насколько я понимаю, человека , который вводит текст в мемо, в то же время, программист воспринимает это выражение совсем по другому .
Уважаемый LK! Вы как всегда в своем духе! Я попытаюсь Вам все объяснить. У нас на работе есть прога с помощью которой люди обрабатывают звуковые файлы. Я сделал свою прогу и добавил возможность просаматривать и обрабатывать видео. В старой проге по нажатию на выше указанные кнопки происходили выше указаные действия. По этому я прошу вас помочь.
1
LK
Заблокирован
26.06.2011, 11:40 17
serg87i, самое умное, что мне пришло в голову "после вчерашнего" - это убирать последний введенный с дополнительной клавиатуры символ, если это символ 1,2,3,4,5,6 , код, может, и китайский , но работает , при этом можно вводить другие символы, и "запрещенные" символы с основной клавиатуры, что, как я понимаю, является важным.
В процессе нажимания буковки, которые 1-2-3-4-5-6 , на немного времени до удаления появляются, но это можно представить пользователю, как "подсказка о нажатой урпавляющей клавише" . В общем, как мог... Если сегодня обратно не накиряюсь, посмотрю в фокус ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
  switch(Key) {
    case  97 : ShowMessage(Key); break; //вместо ShowMessage - может быть Ваш код
    case  98 : ShowMessage(Key); break;
    case  99 : ShowMessage(Key); break;
    case 100 : ShowMessage(Key); break;
    case 101 : ShowMessage(Key); break;
    case 102 : ShowMessage(Key); break;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
  if (Key == VK_NUMPAD1|
      Key == VK_NUMPAD2|
      Key == VK_NUMPAD3|
      Key == VK_NUMPAD4|
      Key == VK_NUMPAD5|
      Key == VK_NUMPAD6) {
    if (Memo1->Text.Length() >= 1) {
      Memo1->Text = Memo1->Text.Delete(Memo1->Text.Length(),1);
    }
  }
}
Ну, а для пущей гламурности можно сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
  int pos,size_p,size_p1,min;
 
  switch(Key) {
    case  97 : // VK_NUMPAD1
      min = 300000;
      size_p1=BASS_ChannelGetPosition(chan,BASS_POS_BYTE);
      pos=((size_p1)-min);
      BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE);
      BASS_ChannelPlay(chan,FALSE);
    break;
    case  98 :  // VK_NUMPAD2
      BASS_ChannelPause(chan);
    break;
    case  99 :  // VK_NUMPAD3
      min = 300000;
      size_p1=BASS_ChannelGetPosition(chan,BASS_POS_BYTE);
      pos=((size_p1)+min);
      BASS_ChannelSetPosition(chan, pos, BASS_POS_BYTE);
      BASS_ChannelPlay(chan,FALSE);
    break;
    case 100 :  // VK_NUMPAD4
      VideoGrabber2->RunPlayerBackwards();
    break;
    case 101 :  // VK_NUMPAD5
      VideoGrabber2->PausePlayer();
    break;
    case 102 :  // VK_NUMPAD6
      VideoGrabber2->RunPlayer();
    break;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
  AnsiString mtxt;
  mtxt = Memo1->Text;
  if (Key == VK_NUMPAD1|
      Key == VK_NUMPAD2|
      Key == VK_NUMPAD3|
      Key == VK_NUMPAD4|
      Key == VK_NUMPAD5|
      Key == VK_NUMPAD6) {
    if (mtxt.Length() >= 1) {
      Memo1->Text = mtxt.Delete(mtxt.Length(),1);
    }
  }
}
2
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
26.06.2011, 11:44 18
LK, моё кунг-фу всё равно круче твоего

C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, wchar_t &Key) {
    if (Key == '5' || Key == VK_NUMPAD5) {
        if (GetAsyncKeyState(VK_NUMPAD5)) {
            Key = NULL;
 
            // твои действия
            // . . .
 
        }
    }
}
1
932 / 757 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
27.06.2011, 06:09 19
serg87i, вот тебе вариант, а то что-то здесь народ уже начинает фантазировать.
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
        this->KeyPreview = true;  // можно в свойствах поставить true
 
        if(Key >= '0' && Key <= '9') { // всё цифры не будут писаться
             tagMSG  msg;
             ZeroMemory(&msg, sizeof(tagMSG));
             PeekMessage(&msg, Memo1->Handle, 0, 0, PM_REMOVE);  // удалить сообщение для поля Memo
        }
}
1
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
27.06.2011, 12:53 20
Лучший ответ Сообщение было отмечено как решение

Решение

xAtom, задача, чтобы не все цифры, а только цифры с дополнительной клавиатуры! И к тому же твой пример можно переписать двумя строчками!

C++
1
2
3
4
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, wchar_t &Key) {
        if (isdigit(Key)) 
               Key = NULL; 
}
Так что "фантазируешь" у нас ты!
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2011, 12:53

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Перехват калавиши с имитацией нажатия
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt;...

Hook (перехват нажатия клавиши)
Не получается осуществить перехват. Код: TfmMain *fmMain; HHOOK hook; LRESULT CALLBACK...

Перехват и имитация нажатия клавиши клавиатуры в чужом приложении
Есть тема... Нужно, чтобы при нажатии на кнопку, например f1 . У меня последовательно с разными...

Перехват события нажатия кнопок вверх/вниз в StringGrid
Как осуществить перехват нажатия кнопок вверх, вниз, вправо, влево ну и заодно кнопки НамЛока?...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.