Главная страница
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
15-1288271870
Правильный$Вася
2010-10-28 17:17
2011.02.06
DVD DL болванки - кто какие пользует и с какими приводами?


15-1283595848
Jee
2010-09-04 14:24
2011.02.06
Запустить одну процедуру несколькими потоками


4-1245172423
Дмитрий
2009-06-16 21:13
2011.02.06
Как создать консольную форму


11-1229287775
DenisArd
2008-12-14 23:49
2011.02.06
Как загрузить иконку нужного формата?


15-1287738749
istok
2010-10-22 13:12
2011.02.06
категории программ..