Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Консольное приложение на Delphi 7

Автор: victorpr
Дата сообщения: 22.05.2003 16:48
Как в консольном приложении на Delphi добиться широко используемого эффекта:
Выполнение приложения останавливается до тех пор, пока не нажата Any Key
(Any Key - это не только Enter). При этом никакого эхо-вывода на консоль не должно происходить. На СИ я бы написал что-то вроде

GetConsoleMode(hStdin, &fdwOldMode)
fdwMode = fdwOldMode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
SetConsoleMode(hStdin, fdwMode);
ReadFile(hStdin, chBuffer, 1, &cRead, NULL);
SetConsoleMode(hStdin, fdwOldMode);

На Delphi попытки изменить режим консоли с помощью виндового API ни к чему хорошему у меня не приводят.
Паскалевских функций типа KeyPressed, ReadKey в Delphi естественно нет.

Может кто-то сталкивался с такой проблемой? Хелп плз!
Автор: woffer
Дата сообщения: 23.05.2003 01:31
victorpr напиши свою типа readkey )
Автор: Pinocchio
Дата сообщения: 23.05.2003 10:56
victorpr
Попробуй повесить стандартный Hook на аппликацию. Но сдаётся мне, что это не поможет, приложение консольного агента не отчитывается перед виндузой. В любом случае Delphi работает с консолью, как с файлом, что является характеристикой Паскаля, но DOS ей не нужен. INT 16H (keypressed) - это в дельфи не пройдёт. Если нужны INT, то попробуй Bloodshed Dev-Pascal, или у них на сайте библиотеки для Delphi.
Автор: victorpr
Дата сообщения: 23.05.2003 13:18
woffer

Цитата:
напиши свою типа readkey

Совет, конечно, - хороший. Однако, мой вопрос: как это сделать, когда управление в консольную прогу попадает только после нажатия на Enter?
Pinocchio

Цитата:
у них на сайте библиотеки для Delphi

по-моему, это единственно умное, что я могу сделать в такой ситуации... грустно...
Автор: Dod
Дата сообщения: 21.09.2011 10:18
Delphi 7. Для вывода вывода графики в режиме консольного приложения написал такой модуль:
procedure GraphInit(ScreenColor: TColor);
{ Вход в графический режим }
begin
ScreenDC := GetDC(0);
Canvas := TCanvas.Create();
Canvas.Handle := ScreenDC;
Canvas.Brush.Color := ScreenColor; // цвет фона
// сохраним экран в файл 'fon.bmp'
BitMap := TBitMap.Create();
BitMap.Height := Screen.Height;
BitMap.Width := Screen.Width;
RectScr := Rect(0, 0, Screen.Width, Screen.Height);
BitMap.Canvas.CopyRect(RectScr, Canvas, RectScr);
BitMap.SaveToFile('fon.bmp');
Rectangle(ScreenDC, 0, 0, Screen.Width, Screen.Height); // чистка экрана
RectCur := Rect(0, 0, 0, 0); // фиксация курсора
ClipCursor(@RectCur);
Canvas.Font.Color := $000000FF; // текст
Canvas.Font.Size := 16;
Canvas.TextOut(Screen.Width-120, Screen.Height-35, 'Выход - Esc');
end;
Беда в том, что при движении курсора мыши наверх всплывают кнопки лежащих ниже окон. Поэтому приходится фиксировать курсор, а это неудобно, если приходится что-то показывать собеседнику на экране (не пальцем же тыкать). Подскажите, пожалуйста, как решить эту проблему.
Автор: rrromano
Дата сообщения: 21.09.2011 11:04
victorpr
_http://www.silicontaiga.ru/home.asp?artId=5757

Здесь всё про консольные приложения в Delphi. В том числе и ваш вопрос.
Автор: Dod
Дата сообщения: 17.10.2014 17:12
silicontaiga - это шедевр!
Спасибо за подсказку.
Автор: drimplex
Дата сообщения: 31.12.2014 10:06
Если вы делаете стандартный проект Console Application:
READLN; //и прога будет висеть в ожидании нажатия любого ввода с клавиатуры

+Можно сделать стандартное консольное приложение, перехватить нужные хендлы через API и делать с ним что нужно.
Автор: landy
Дата сообщения: 31.12.2014 18:39

Цитата:
READLN; //и прога будет висеть в ожидании нажатия любого ввода с клавиатуры


Цитата:
victorpr: Any Key - это не только Enter). При этом никакого эхо-вывода на консоль не должно происходить.

С новым годом!
Автор: drimplex
Дата сообщения: 01.01.2015 13:26
landy: благодарю. пропустил условие.

victorpr: Any Key - это не только Enter).
можно сделать апи-хук на клавиатуру.
Автор: rrromano
Дата сообщения: 01.01.2015 15:38

Цитата:
Спасибо за подсказку.

На здоровье. С Новым годом всех! ).
Автор: xpin2013
Дата сообщения: 05.01.2015 06:51
drimplex

Цитата:
можно сделать апи-хук на клавиатуру.

1) Поскольку я писал свой собственный сниффер, для слежения за женой, заметил, что кнопки нажимаемые в консоли - например FAR Manager, не снифярятся. То есть дело скорее всего не в привилегиях, а просто апи-хук консоли невозможен. По моему для Delphi я видел проект - DOS-BOX, там много всего для консоли.

2) Зачем старьё вытаскиваете? Ответ буратины был 23-05-2003. Моё мнение - KeyPressed - это бантики, в консольной программе можно обойтись и readln с надписью перед ним - нажмите Enter. Enter можно отправить в консоль не пользуясь клавиатурой, а вот пока KeyPressed не произойдёт - прога будет висеть. Не стоит морочить себе голову всякими бантиками при написании CONSOLE.
Автор: landy
Дата сообщения: 05.01.2015 11:40

Цитата:
заметил, что кнопки нажимаемые в консоли - например FAR Manager, не снифярятся

1. Сниферы обычно работают на более низком уровне (заодно и маскируясь получше)
2. Представь себе FAR (консольная ведь программа), управляемый только readln.


Автор: xpin2013
Дата сообщения: 05.01.2015 12:47
landy

Цитата:
1. Сниферы обычно работают на более низком уровне

Не сказал бы что на низком - тот же WinAPI, без него только драйвером на нулевом уровне процессора. Да и маскироваться от жены? - она даже не знает что такое список процессов.


Цитата:
2. Представь себе FAR (консольная ведь программа), управляемый только readln.

На счёт консоли - это верно, но на счёт FAR тут не правда, он веть знает какой у него размер консоли - пихает туда (в память текстового знакогенератора) символы которые надо рисовать чтобы были панельки с файлами (это я знаю точно, так как он FAR ещё не забыл, как переключаться из графического режима Windows в простой текстовый режим BIOS если он у вас текстовый). Да и клавишу F1 он обрабатывает сам. так что не readln в FAR, но readln для FAR cmd Console.

Страницы: 1

Предыдущая тема: c++ builder - получить hex значение символа


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.