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

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

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

Yurakl
новенький
Сообщения: 62
Зарегистрирован: 20.01.2010 07:59:53

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

Сообщение Yurakl »

Добрый день. Есть такой вопрос.
У меня программа запускается автоматически и при нажатии клавиш "Ctrl+C" она продолжает работать.
Как сделать обработку этих клавиш в самой программе? Как их считать?чтобы при их нажатии или другом сочетании клавиш программы прекращала работу.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Программа консольная или гуишная?
Если гуи, то у главной формы свойство 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;
Yurakl
новенький
Сообщения: 62
Зарегистрирован: 20.01.2010 07:59:53

Сообщение Yurakl »

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

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

Сообщение Mr.Smart »

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

Добавлено спустя 24 секунды:
Вот так и думал....
Yurakl
новенький
Сообщения: 62
Зарегистрирован: 20.01.2010 07:59:53

Сообщение Yurakl »

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

да, я написал, что приложение консольное
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Нужно смотреть в сторону таких событий формы как:
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 раз.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Yurakl
Для ввода/вывода вы пользуетесь стандартными функциями Read(Ln)/Write(Ln) или нет?
И ещё под какую ОС программа?
Yurakl
новенький
Сообщения: 62
Зарегистрирован: 20.01.2010 07:59:53

Сообщение Yurakl »

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

Mr.Smart, под линуксом работает(надо было сразу сказать, извиняюсь. данные программа выводит на экран с помощью writeln
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Yurakl
Странно у меня под Win32 возникает Exception (STATUS_CONTROL_C_EXIT) и программа завершается.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

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
Yurakl
новенький
Сообщения: 62
Зарегистрирован: 20.01.2010 07:59:53

Сообщение Yurakl »

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

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

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

Сообщение Yurakl »

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

Сообщение VirtUX »

Может это поможет?
Yurakl
новенький
Сообщения: 62
Зарегистрирован: 20.01.2010 07:59:53

Сообщение Yurakl »

VirtUX, к сожалению, по данной ссылке не заходит....
наверняка должна быть функция, которая позволяет считывать нажатые клавиши
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

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

странно, у меня заходит... вот текст ссылки http://www.linux.org.ru/forum/developme ... nt-2510604
это тема с лора по той же проблеме.
Ответить