1 / 1 / 0
Регистрация: 27.10.2011
Сообщений: 20
1

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

22.11.2011, 16:04. Показов 2424. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте Все!
Операционная среда - XP, инструмент C++ Builder 6.
По нажатию кнопки в цикле while(1) {.........} производятся опросы регистров LPT-порта.
Хотелось бы остановиться, когда нужно.
Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2011, 16:04
Ответы с готовыми решениями:

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

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

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

Глобальный перехват клавиши
Мне нужно глобально перехватит клавишу чтобы при нажатии на Shift + num1 (цыфра 1) закрывало...

10
LK
Заблокирован
22.11.2011, 16:13 2
Команда досрочного выхода
применяется, когда необходимо прервать выполнение цикла, в котором условие выхода ещё не достигнуто. Такое бывает, например, когда при выполнении тела цикла обнаруживается ошибка, после которой дальнейшая работа цикла не имеет смысла.

Команда досрочного выхода обычно называется EXIT или break, а её действие аналогично действию команды безусловного перехода (goto) на команду, непосредственно следующую за циклом, внутри которого эта команда находится. Так, в языке Си два нижеприведённых цикла работают совершенно одинаково:
C++
1
2
3
4
5
// Применение оператора break
while(<условие>) 
  ... операторы
  if (<ошибка>) break;
  ... операторы
... продолжение программы
C++
1
2
3
4
5
6
7
// Аналогичный фрагмент без break
while(<условие>) 
  ... операторы
  if (<ошибка>) goto break_label;
  ... операторы 
 
break_label:
... продолжение программы

В обоих случаях, если в теле цикла выполнится условие <ошибка>, будет произведён переход на операторы, обозначенные как «продолжение программы». Таким образом, оператор досрочного выхода из цикла, по сути, просто маскирует безусловный переход, однако использование break предпочтительнее, чем goto, поскольку поведение break чётко задано языком, потенциально менее опасно (нет, например, вероятности ошибиться с положением или названием метки). Кроме того, явный досрочный выход из цикла не нарушает принципов структурного программирования.

Обычный оператор досрочного выхода прерывает работу того цикла, в котором он непосредственно находится. В ряде языков программирования функциональность этого оператора расширена, он позволяет выходить из нескольких вложенных циклов (см. ниже). В таких случаях цикл, из которого требуется выйти, помечается меткой, а в операторе досрочного выхода указывается эта метка.
0
1 / 1 / 0
Регистрация: 27.10.2011
Сообщений: 20
22.11.2011, 16:26  [ТС] 3
Никакой ошибки нет. Просто ожидается, что процесс длительный и захочется остановить самому

Добавлено через 1 минуту
Функции getch() и kbhit() под XP не работают
Нужно наверное типа перехватчика
0
LK
Заблокирован
22.11.2011, 16:30 4
при чем здесь ошибка ? ставите свое бутон-клик() и будет вам счастье , да и пример этот из википедии - всего лишь как направление думания
0
1 / 1 / 0
Регистрация: 27.10.2011
Сообщений: 20
23.11.2011, 08:16  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TfmMain::bbtWriteClick(TObject *Sender)
{if(edFileName->Text !=""    )
   {FileCreate(edFileName->Text + ".txt");
   }
else return;
lbStop->Visible=true;
bool done=false;
int c;
while(!done)
   {int ZZ=kbhit();
   if(ZZ)
      {c=getch();
      if(c==0x27)
         {done=true;
         }
      }
   }
lbStop->Visible=false;
}
Это фрагмент (как пример для разговора) обработчика события нажатия кнопки
Цикл нужно прервать например при нажатии <Esc>
И где мне поставить бутон-клик()?
0
wtf!?
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
23.11.2011, 13:06 6
Обьявляешь булевую переменную , пусть с неймом stop, cтавишь свойство формы keypreview в тру, делаешь обработчик события onkeyoress, в нем пишешь
C++
1
2
if(key=VK_ESC) // не помню код esc, посмотри в хелпе и не помню key или Key, посмотри а параметрах обработчика Onkeypress 
stop=true;
Ну и в своем вайле пишешь
C++
1
2
3
4
if(stop=true){
stop=false;
//еще код если нужно 
break;}
Примерно так
1
1 / 1 / 0
Регистрация: 27.10.2011
Сообщений: 20
24.11.2011, 09:35  [ТС] 7
На форме - это работает, а внутри цикла - нет
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
25.11.2011, 02:07 8
Цитата Сообщение от astranamus Посмотреть сообщение
На форме - это работает, а внутри цикла - нет
А переменнная, указывающая на остановку цикла, где находится(объявлена)? И есть ли возможность изменить эту переменную (в цикле есть ProcessMessages)?
0
1 / 1 / 0
Регистрация: 27.10.2011
Сообщений: 20
25.11.2011, 08:26  [ТС] 9
Переменная done объявлена перед циклом
ProcessMessages в цикле нет - попробую
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
25.11.2011, 10:17 10
Цитата Сообщение от astranamus Посмотреть сообщение
Переменная done объявлена перед циклом
ProcessMessages в цикле нет - попробую
Если переменная объявленна в процедуре, то никакие кнопки менять ее значение не будут, объявляйте ее в public/private/protected класса формы, а перед циклом, только изменяйте ее на значение по умолчанию.
1
1 / 1 / 0
Регистрация: 27.10.2011
Сообщений: 20
25.11.2011, 10:47  [ТС] 11
Вот этот код работает
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
void __fastcall TfmMain::bbtWriteClick(TObject *Sender)
{if(edFileName->Text !=""    )
   {FileCreate(edFileName->Text + ".txt");
   }
else return;
lbStop->Visible=true;
done=false;
int c=1;
int time=GetTickCount();
while(!done)                  //!done)
   {while((GetTickCount()-time)<=1000)//Задержака в цикле
      {;
      }
   Application->ProcessMessages();
   time=GetTickCount();
   c++;
   }
lbStop->Visible=false;
}
//---------------------------------------------------------------------------
 
void __fastcall TfmMain::FormKeyPress(TObject *Sender, char &Key)
{
if(Key==27)
   done=true;
}
СПАСИБО
0
25.11.2011, 10:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2011, 10:47
Помогаю со студенческими работами здесь

Перехват клавиши на C++ Builder
Здравствуйте, мне нужно сделать глобальный перехват клавиши (PrtScr). Я поискал на форуме ответы на...

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

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

Перехват и повторное нажатие клавиши
Здравствуйте Форумчане. Созрел такой вопрос на счет системной ловушки. Необходимо чтобы когда...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru