Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2018, 13:47   #1
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
Вопрос [Delphi] Странности после AttachConsole

Всем доброго времени суток.
Хочу в своём Desktop'ном приложении реализовать поддержку консоли.
Написал проверку:
Код:
program Test;

uses
  Winapi.Windows, Vcl.Forms;

function AttachConsole(dwProcessID: Integer): Boolean;
  stdcall; external 'kernel32.dll';

function ReadKey:Char;
var
  Console:THandle;
  K:DWORD;
  Q:TInputRecord;
Begin
  ReadKey:=#0;
  K:=0;
  Console:=GetStdHandle(STD_INPUT_HANDLE);
  PeekConsoleInput(Console,Q,1,K);
  if K>0 then
  begin
    ReadConsoleInput(Console,Q,1,K);
    if((Q.EventType=1)and(Q.Event.KeyEvent.bKeyDown))then
      ReadKey:=Char(Q.Event.KeyEvent.wVirtualKeyCode);
  end;
end;

var
  C:Char;
  Form:TForm;
begin
  // если программу запустили с параметром -t
  if ParamStr(1) = '-t' then
  begin
    // если программу запустили из консоли
    // и нам удалось к ней присоедениться
    if AttachConsole($FFFFFFFF) then
    repeat
      C:=#0;
      while C=#0 do
        C:=ReadKey;
      Write(C+'!');
    until False;
  end
  else
  begin
    // если программу запустили без параметров или с двойного клика
    // запускаем оконное приложение
    Application.Initialize;
    Application.CreateForm(TForm,Form);
    Application.Run;
  end;
end.
При обычном запуске из cmd "C:\test.exe -t"
перестаёт срабатывать функция ReadKey;
Если записать строку "C:\test.exe -t" в .bat файл
и в cmd запустить уже батник - ReadKey срабатывает (странно).

Хотя мне нужно чтоб работали оба способа.
- Ладно. Допустим что с этим можно жить.
Подумал я и заменил PeekConsoleInput на GetAsyncKeyState,
и добавил очистку окна консоли от текста (+2 функции).
Код:
function KeyPressedAsync(Key:Word; Wait:Boolean=True):Boolean;
begin
  Result:=False;
  if GetAsyncKeyState(Key) <> 0 then
  begin
    Result:=True;
    if Wait then // ждем пока клавишу отожмут
      while GetAsyncKeyState(Key) AND $8000 <> 0 DO {Nothing};
    FlushConsoleInputBuffer(STD_INPUT_HANDLE);
  end
end;

procedure ClrScr;
var
  I:Integer;
  _Pos:TCoord;
  Console:THandle;
  Info:TConsoleScreenBufferInfo;
  Output:DWORD;
Begin
  Console:=GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(Console,Info);
  _Pos.X:=0;
  _Pos.Y:=0;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),_Pos);
  for I:=0 to 80 do
  Begin
    _Pos.X:=0;
    _Pos.Y:=I;
    FillConsoleOutputCharacter(Console,#32 ,80,_Pos,Output);
    FillConsoleOutputAttribute(Console,Info.wAttributes,80,_Pos,Output);
  end;
end;
Те же яйца вид сбоку.
Код:
var
  C:Char;
  Form:TForm;
begin
  // если программу запустили с параметром -t
  if ParamStr(1) = '-t' then
  begin
    // если программу запустили из консоли
    // и нам удалось к ней присоедениться
    if AttachConsole($FFFFFFFF) then
    repeat
      if KeyPressedAsync(VK_UP) then
      begin
        ClrScr;
        Write('up');
      end;
    until False;
  end
  else
  begin
    // если программу запустили без параметров или с двойного клика
    // запускаем оконное приложение
    Application.Initialize;
    Application.CreateForm(TForm,Form);
    Application.Run;
  end;
end.
Такой способ обрабатывает нажатие клавиш.
Но при вызове из cmd и нажатии стрелки вверх - показывает предыдущую строку которую я вводил в консоль. Чего вроде как происходить не должно. Если вызывать очистку экрана строка исчезнет. Но смотреть на эти моргания на экране при каждом нажатии - конечно не комильфо.
А при вызове из батника - опять всё обрабатывается нормально.
И если создавать свою консоль через AllocConsole - тоже всё работает.

Собственно вопрос: Что не так с запуском из cmd и AttachConsole?
Вложения
Тип файла: zip attach.zip (1.4 Кб, 8 просмотров)
пыжок

Последний раз редактировалось maloun; 17.05.2018 в 14:07.
maloun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
странности с HDD Артэс Компьютерное железо 1 12.02.2018 10:46
Странности с полиморфизмом _Bers Общие вопросы C/C++ 4 03.02.2012 20:48
UnloadKeyboardLayout - странности Radical_Edward Win Api 0 29.01.2012 14:29
Странности с отступами evheniys HTML и CSS 7 06.06.2011 10:42
Странности в Builder 6 Foxtrod C++ Builder 10 03.10.2009 01:09