выход из программы по нажатию клавиш

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

выход из программы по нажатию клавиш

Сообщение Yurakl » 25.05.2010 09:32:15

Добрый день. Есть такой вопрос.
У меня программа запускается автоматически и при нажатии клавиш "Ctrl+C" она продолжает работать.
Как сделать обработку этих клавиш в самой программе? Как их считать?чтобы при их нажатии или другом сочетании клавиш программы прекращала работу.
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: выход из программы по нажатию клавиш

Сообщение VirtUX » 25.05.2010 09:53:00

Программа консольная или гуишная?
Если гуи, то у главной формы свойство KeyPreview делаешь true. И в событии OnKeyDown пишешь
Код: Выделить всё
procedure TfUI.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if ((Key = ord('C'))or(Key = ord('c')))and(Shift=[ssCtrl]) then Application.Terminate;
end;
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: выход из программы по нажатию клавиш

Сообщение Yurakl » 25.05.2010 09:59:42

программа консольная. никакой графики нет
извиняюсь за глупый вопрос. эта процедура пишется до основного цикла. а в цикле она как описывается??

Добавлено спустя 59 секунд:
ну и там по другому необходимо, раз без формы у меня
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: выход из программы по нажатию клавиш

Сообщение Mr.Smart » 25.05.2010 10:00:42

VirtUX
Мне кажется (не пойму почему), но Yurakl имеет ввиду консольное приложение?! Или нет?

Добавлено спустя 24 секунды:
Вот так и думал....
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: выход из программы по нажатию клавиш

Сообщение Yurakl » 25.05.2010 10:01:16

Mr.Smart писал(а):VirtUX
Мне кажется (не пойму почему), но Yurakl имеет ввиду консольное приложение?! Или нет?

да, я написал, что приложение консольное
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: выход из программы по нажатию клавиш

Сообщение Maxizar » 25.05.2010 10:04:36

Нужно смотреть в сторону таких событий формы как:
procedure FormKeyDown
procedure FormKeyUp
и внутри этих фунций разобрав посланую комбинацию делать нужную команду.
параметры в этих функции такие Key - это номер (индекс) зажатой клавиши см Гугл или пользуйся командой Ord('C')- даст номер (индекс) клавиши с буквой С. Shift - множество определено в classesh.inc как:
TShiftState = set of TShiftStateEnum; где
TShiftStateEnum = (ssShift, ssAlt, ssCtrl,
ssLeft, ssRight, ssMiddle, ssDouble,
// Extra additions
ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum,
ssScroll,ssTriple,ssQuad,ssExtra1,ssExtra2);

Пример формы:

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
   private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
   if  Key= 27 then  //если нажали ESC то выходим из программы
   close;
   if (Key=76) and (ssAlt in Shift) then //если Alt+L - то минимизировать
    application.Minimize;
end;

end.



Если же нужно думать про глобальное сочетание клавишь то смотри в сторону глобальных Хуков (Hook) ловушек (но это для винды) как уже написано поищи на форуме.

Ну если консоль то в винде Нужен Hook ^)
Последний раз редактировалось Maxizar 25.05.2010 10:08:29, всего редактировалось 1 раз.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: выход из программы по нажатию клавиш

Сообщение Mr.Smart » 25.05.2010 10:06:33

Yurakl
Для ввода/вывода вы пользуетесь стандартными функциями Read(Ln)/Write(Ln) или нет?
И ещё под какую ОС программа?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: выход из программы по нажатию клавиш

Сообщение Yurakl » 25.05.2010 10:08:43

Maxizar, я же написал, что у меня программа консольная, без всяких форм и приложений, запускаешь машинку и она автоматически начинает работать

Mr.Smart, под линуксом работает(надо было сразу сказать, извиняюсь. данные программа выводит на экран с помощью writeln
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: выход из программы по нажатию клавиш

Сообщение Mr.Smart » 25.05.2010 10:21:07

Yurakl
Странно у меня под Win32 возникает Exception (STATUS_CONTROL_C_EXIT) и программа завершается.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: выход из программы по нажатию клавиш

Сообщение VirtUX » 25.05.2010 10:21:37

Yurakl писал(а):запускаешь машинку и она автоматически начинает работать... ...под линуксом работает(надо было сразу сказать, извиняюсь. данные программа выводит на экран с помощью writeln

т.е. X-ы не стартуют? В принципе в консоли должна срабатывать комбинация Ctrl+C или Ctrl+Z

Добавлено спустя 1 минуту 55 секунд:
Вот даже проверил на пинге:
Код: Выделить всё
vital:~ # ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=128 time=0.299 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=128 time=0.346 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=128 time=0.319 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=128 time=0.178 ms
64 bytes from 192.168.0.1: icmp_seq=5 ttl=128 time=0.352 ms
^C
--- 192.168.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.178/0.298/0.352/0.067 ms
vital:~ # ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=128 time=0.342 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=128 time=0.331 ms
^Z
[1]+  Stopped                 ping 192.168.0.1
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: выход из программы по нажатию клавиш

Сообщение Yurakl » 25.05.2010 10:25:22

эта комбинация срабатывает, если я программу запуская вручную.
а если автоматический запуск, который осуществляется после подключения и загрузки всех сервисов, то нет никакой реакции....

Добавлено спустя 1 час 8 минут 59 секунд:
Есть же наверное какая-то функция, которая позволяет обрабатывать нажатие клавиш для каких-либо процессов?даже если говорить не о ctrl+c

Добавлено спустя 22 часа 23 минуты 44 секунды:
если подключать библиотеку crt, то программа не работает в нормальном режиме.
как решить данный вопрос?
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: выход из программы по нажатию клавиш

Сообщение Yurakl » 27.05.2010 11:18:12

нашел, что в винде используется функция GetAsyncKeyState. а как все под линуксом обстоит??
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: выход из программы по нажатию клавиш

Сообщение VirtUX » 27.05.2010 11:51:32

Может это поможет?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: выход из программы по нажатию клавиш

Сообщение Yurakl » 27.05.2010 12:50:18

VirtUX, к сожалению, по данной ссылке не заходит....
наверняка должна быть функция, которая позволяет считывать нажатые клавиши
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Re: выход из программы по нажатию клавиш

Сообщение VirtUX » 27.05.2010 13:50:24

Yurakl писал(а):к сожалению, по данной ссылке не заходит....

странно, у меня заходит... вот текст ссылки http://www.linux.org.ru/forum/developme ... nt-2510604
это тема с лора по той же проблеме.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru