выход из программы по нажатию клавиш
Модератор: Модераторы
выход из программы по нажатию клавиш
Добрый день. Есть такой вопрос.
У меня программа запускается автоматически и при нажатии клавиш "Ctrl+C" она продолжает работать.
Как сделать обработку этих клавиш в самой программе? Как их считать?чтобы при их нажатии или другом сочетании клавиш программы прекращала работу.
У меня программа запускается автоматически и при нажатии клавиш "Ctrl+C" она продолжает работать.
Как сделать обработку этих клавиш в самой программе? Как их считать?чтобы при их нажатии или другом сочетании клавиш программы прекращала работу.
Программа консольная или гуишная?
Если гуи, то у главной формы свойство KeyPreview делаешь true. И в событии OnKeyDown пишешь
Если гуи, то у главной формы свойство 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; программа консольная. никакой графики нет
извиняюсь за глупый вопрос. эта процедура пишется до основного цикла. а в цикле она как описывается??
Добавлено спустя 59 секунд:
ну и там по другому необходимо, раз без формы у меня
извиняюсь за глупый вопрос. эта процедура пишется до основного цикла. а в цикле она как описывается??
Добавлено спустя 59 секунд:
ну и там по другому необходимо, раз без формы у меня
VirtUX
Мне кажется (не пойму почему), но Yurakl имеет ввиду консольное приложение?! Или нет?
Добавлено спустя 24 секунды:
Вот так и думал....
Мне кажется (не пойму почему), но Yurakl имеет ввиду консольное приложение?! Или нет?
Добавлено спустя 24 секунды:
Вот так и думал....
Mr.Smart писал(а):VirtUX
Мне кажется (не пойму почему), но Yurakl имеет ввиду консольное приложение?! Или нет?
да, я написал, что приложение консольное
Нужно смотреть в сторону таких событий формы как:
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);
Пример формы:
Если же нужно думать про глобальное сочетание клавишь то смотри в сторону глобальных Хуков (Hook) ловушек (но это для винды) как уже написано поищи на форуме.
Ну если консоль то в винде Нужен Hook ^)
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 раз.
Yurakl
Для ввода/вывода вы пользуетесь стандартными функциями Read(Ln)/Write(Ln) или нет?
И ещё под какую ОС программа?
Для ввода/вывода вы пользуетесь стандартными функциями Read(Ln)/Write(Ln) или нет?
И ещё под какую ОС программа?
Maxizar, я же написал, что у меня программа консольная, без всяких форм и приложений, запускаешь машинку и она автоматически начинает работать
Mr.Smart, под линуксом работает(надо было сразу сказать, извиняюсь. данные программа выводит на экран с помощью writeln
Mr.Smart, под линуксом работает(надо было сразу сказать, извиняюсь. данные программа выводит на экран с помощью writeln
Yurakl
Странно у меня под Win32 возникает Exception (STATUS_CONTROL_C_EXIT) и программа завершается.
Странно у меня под Win32 возникает Exception (STATUS_CONTROL_C_EXIT) и программа завершается.
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
эта комбинация срабатывает, если я программу запуская вручную.
а если автоматический запуск, который осуществляется после подключения и загрузки всех сервисов, то нет никакой реакции....
Добавлено спустя 1 час 8 минут 59 секунд:
Есть же наверное какая-то функция, которая позволяет обрабатывать нажатие клавиш для каких-либо процессов?даже если говорить не о ctrl+c
Добавлено спустя 22 часа 23 минуты 44 секунды:
если подключать библиотеку crt, то программа не работает в нормальном режиме.
как решить данный вопрос?
а если автоматический запуск, который осуществляется после подключения и загрузки всех сервисов, то нет никакой реакции....
Добавлено спустя 1 час 8 минут 59 секунд:
Есть же наверное какая-то функция, которая позволяет обрабатывать нажатие клавиш для каких-либо процессов?даже если говорить не о ctrl+c
Добавлено спустя 22 часа 23 минуты 44 секунды:
если подключать библиотеку crt, то программа не работает в нормальном режиме.
как решить данный вопрос?
нашел, что в винде используется функция GetAsyncKeyState. а как все под линуксом обстоит??
Может это поможет?
VirtUX, к сожалению, по данной ссылке не заходит....
наверняка должна быть функция, которая позволяет считывать нажатые клавиши
наверняка должна быть функция, которая позволяет считывать нажатые клавиши
Yurakl писал(а):к сожалению, по данной ссылке не заходит....
странно, у меня заходит... вот текст ссылки http://www.linux.org.ru/forum/developme ... nt-2510604
это тема с лора по той же проблеме.
