Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.06;
Скачать: CL | DM;

Вниз

Чтение цвета символа в консоли   Найти похожие ветки 

 
antsa   (2010-11-15 08:41) [0]

Доброго времени суток. Когда мне нужно было читать символ из DOS окна я делал таким образом:

type
 TAttachConsole = function (dwProcessId: DWORD): LongBOOL stdcall; //для чтения с консоли
var
 Hcwnd : Cardinal; //для чтения с консоли

procedure TFormSensor.FormCreate(Sender: TObject);
var
 HndlBKZ : integer;//для чтения с консоли
 mProcessID:Cardinal;//для чтения с консоли
 AttachConsole : TAttachConsole;//для чтения с консоли
begin
 //Не трожь - магия (4 строчки)
 @AttachConsole := GetProcAddress(GetModuleHandle("kernel32.dll"), "AttachConsole");//для чтения с консоли
 HndlBKZ:=FindWindow("ConsoleWindowClass",nil);//для чтения с консоли
 GetWindowThreadProcessId(HndlBKZ,@mProcessID);//для чтения с консоли
 AttachConsole(mProcessID);//для чтения с консоли
end;

function TFormSensor.ReadCMD(x, y, s: byte): string;
var
 chRead: Cardinal;
 BufInfo: _CONSOLE_SCREEN_BUFFER_INFO;
 lpCh : PChar;
 Coord: _COORD;
begin
 Result:="";
 Hcwnd:=GetStdHandle(STD_OUTPUT_HANDLE);
 GetConsoleScreenBufferInfo (Hcwnd, BufInfo);
 GetMem(lpCh,s);
 Coord.X:=x;
 Coord.Y:=y;
 ReadConsoleOutputCharacter(Hcwnd,lpCh,s,Coord,chRead);
 Result:=copy(lpCh,1,s);
end;



И тогда вызывая ReadCMD(x, y, s: byte) я читаю s символов, а x,y - это координаты первого читаемого символа.

Вот теперь вопрос, а как узнать цвет символа?


 
Anatoly Podgoretsky ©   (2010-11-15 09:06) [1]

> antsa  (15.11.2010 08:41:00)  [0]

Не надо врать про ДОС, это обычная Виндоус программа.


 
CrytoGen   (2010-11-15 09:13) [2]

Плохо искали:
http://msdn.microsoft.com/en-us/library/ms684968(v=VS.85).aspx
и зачем вы вызываете GetConsoleScreenBufferInfo (Hcwnd, BufInfo); если потом не используете полученную информацию?


 
antsa   (2010-11-15 09:31) [3]


> Не надо врать про ДОС, это обычная Виндоус программа.

Не понял. программа ИЗ которой я читаю cmd программа КОТОРАЯ читает - моя, под виндоус.

> Плохо искали:
> http://msdn.microsoft.com/en-us/library/ms684968(v=VS.85).
> aspx
> и зачем вы вызываете GetConsoleScreenBufferInfo (Hcwnd,
> BufInfo); если потом не используете полученную информацию?
>

Сейчас читаю http://msdn.microsoft.com/en-us/library/ms684965(VS.85).aspx
Не могли бы сказать что проще ReadConsoleOutputAttribute или ReadConsoleOutput если мне нужно прочитать цвет и символ из консоли?
P.S. GetConsoleScreenBufferInfo (Hcwnd, BufInfo); что то проглядел да, не нужно.


 
Anatoly Podgoretsky ©   (2010-11-15 09:37) [4]

> antsa  (15.11.2010 09:31:03)  [3]

Что такое CMD программа, это новый класс программ в Виндоус?


 
antsa   (2010-11-15 09:54) [5]


> Что такое CMD программа, это новый класс программ в Виндоус?

Прога была написано давно для ДОС, сейцас такие запускаются через командную сторку (CMD) которая открывает ntdvm - эмулятор dos. я работаю просто с консольной прогой для винды. Все так?


 
Slym ©   (2010-11-15 10:15) [6]

var Attrs: array of word;
...
SetLength(Attrs, s);
ReadConsoleOutputAttribute(Hcwnd,@Attrs[0],s,Coord,chRead);


 
antsa   (2010-11-15 10:33) [7]


> Slym ©   (15.11.10 10:15) [6]
> var Attrs: array of word;
> ...
> SetLength(Attrs, s);
> ReadConsoleOutputAttribute(Hcwnd,@Attrs[0],s,Coord,chRead);
>


Если s:=1 то как узнать цвет символа который:

 Coord.x:=1;
 Coord.y:=1;


 
antsa   (2010-11-15 12:14) [8]

как из attrs[0] вытащить цвет и символ, пожалуЙста!


 
Anatoly Podgoretsky ©   (2010-11-15 12:50) [9]

В attrs[0] нет символа, поэтому никак


 
antsa   (2010-11-15 13:57) [10]

а цвет???


 
Anatoly Podgoretsky ©   (2010-11-15 14:22) [11]

Attibute := attrs[0];

Атрибут это и есть цвет.


 
Slym ©   (2010-11-16 07:51) [12]

attrs - word (2 байта)
в одном байте цвет символа в другом цвет фона


 
Anatoly Podgoretsky ©   (2010-11-16 08:46) [13]

> Slym  (16.11.2010 07:51:12)  [12]

Справка с тобой не согласна, Один байт содержит и цвет символа и цвет фона,
в формате текстовых аттрибутов ДОС, а второй байт используется для DBCS


 
antsa   (2010-11-17 10:28) [14]

Извините что долго не был, спасибо вам, решил, вот:

procedure TForm1.FormCreate(Sender: TObject);
var
 HndlBKZ : integer;//для чтения с консоли
 mProcessID:Cardinal;//для чтения с консоли
 AttachConsole : TAttachConsole;//для чтения с консоли
begin
 //Не трожь - магия (4 строчки)
 @AttachConsole := GetProcAddress(GetModuleHandle("kernel32.dll"), "AttachConsole");//для чтения с консоли
 HndlBKZ:=FindWindow("ConsoleWindowClass",nil);//для чтения с консоли
 GetWindowThreadProcessId(HndlBKZ,@mProcessID);//для чтения с консоли
 AttachConsole(mProcessID);//для чтения с консоли
end;


procedure TForm1.Button2Click(Sender: TObject);
var
 chRead: Cardinal;
 Coord: _COORD;
 Hcwnd : Cardinal; //для чтения с консоли
 x,y,s:byte;
 Temp: Smallint;
begin
 Hcwnd:=GetStdHandle(STD_OUTPUT_HANDLE);
 x:=StrToInt(Form1.Edit1.Text);
 y:=StrToInt(Form1.Edit2.Text);
 s:=StrToInt(Form1.Edit3.Text);
 Coord.X:=x;
 Coord.Y:=y;
 ReadConsoleOutputAttribute(Hcwnd,@temp,s,Coord,chRead);
 Button2.Caption:=IntToStr(Temp);
end;

первая цифра это фон, вторая это цвет символа!!!



Страницы: 1 вся ветка

Текущий архив: 2011.02.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
6-1233829100
n00b T_T
2009-02-05 13:18
2011.02.06
IdMappedPortUDP: считать месагу вручную =)


2-1289747895
Анонимус
2010-11-14 18:18
2011.02.06
Пара вопросов по Дэльфи 7


3-1252323554
Grant
2009-09-07 15:39
2011.02.06
FireBird embedded+FIBPlus и текстовые файлы


4-1244878777
Vampire Kain
2009-06-13 11:39
2011.02.06
Как получить координаты чужого окна?


2-1289811718
на4инающий
2010-11-15 12:01
2011.02.06
парсинг имени файла