![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно выделить содержимое окна консольного приложения [D5, D7, Win95/98, WinXP]
вп © (2006-11-02 22:07:00)Как можно выделить содержимое окна консольного приложения?
Нашел я окно, а теперь мне нужно выделить его КАК ТЕКСТ, как графику вариант не устраивает. И скопировать все это добро в буфер обмена для последующей обработки(т.е. для 9х систем вариант как вроде нажал кнопки Выделить, Копировать в буфер обюмена). В АПИ я слаб. Нашел в Сети только вариант с копированием в БМП. Если это вообще реально.
BiN (2006-11-07 09:57:00) [1]подарок:
function CCOORD(AX, AY: Smallint): COORD;
begin
with Result do
begin
X:=AX;
Y:=AY;
end;
end;
procedure SaveConsoleToStream(hConsole: THandle; Stream: TStream);
var
BufferInfo: CONSOLE_SCREEN_BUFFER_INFO;
Buffer: PByteArray;
dwSize: DWORD;
ReadRegion: SMALL_RECT;
bWidth, bHeight, bCurrentLine: Smallint;
begin
Stream.Size:=0;
Win32Check(GetConsoleScreenBufferInfo(hConsole, BufferInfo));
bWidth:=BufferInfo.dwSize.X;
bHeight:=BufferInfo.srWindow.Bottom;
Buffer:=nil;
bCurrentLine:=0;
ReadRegion.Left:=0;
ReadRegion.Right:=bWidth-1;
dwSize:=bWidth*BufferInfo.dwSize.Y*SizeOf(CHAR_INFO);
Buffer:=AllocMem(dwSize);
try
repeat
ReadRegion.Top:=bCurrentLine;
ReadRegion.Bottom:=bCurrentLine+bHeight-1;
if not ReadConsoleOutputW(hConsole, @Buffer^[BufferInfo.dwSize.X*bCurrentLine*SizeOf(CHAR_INFO)], CCOORD(bWidth, bHeight),
CCOORD(0, 0), ReadRegion) then
RaiseLastOSError;
bCurrentLine:=bCurrentLine+bHeight;
if bCurrentLine+bHeight>BufferInfo.dwSize.Y then
bHeight:=BufferInfo.dwSize.Y-bCurrentLine;
until bHeight<=0;
Stream.WriteBuffer(BufferInfo, SizeOf(BufferInfo));
Stream.WriteBuffer(Buffer^, dwSize);
finally
ReallocMem(Buffer, 0);
end;
end;
procedure LoadConsoleFromStream(hConsole: THandle; Stream: TStream);
var
BufferInfo: CONSOLE_SCREEN_BUFFER_INFO;
Buffer: PByteArray;
dwSize: DWORD;
WriteRegion: SMALL_RECT;
bWidth, bHeight, bCurrentLine: Smallint;
begin
Stream.ReadBuffer(BufferInfo, SizeOf(BufferInfo));
dwSize:=BufferInfo.dwSize.X*BufferInfo.dwSize.Y*SizeOf(CHAR_INFO);
Buffer:=AllocMem(dwSize);
try
Stream.ReadBuffer(Buffer^, dwSize);
bWidth:=BufferInfo.dwSize.X;
WriteRegion.Left:=0;
WriteRegion.Right:=bWidth-1;
bHeight:=BufferInfo.srWindow.Bottom;
bCurrentLine:=0;
Win32Check(SetConsoleScreenBufferSize(hConsole, BufferInfo.dwSize));
repeat
WriteRegion.Top:=bCurrentLine;
WriteRegion.Bottom:=bCurrentLine+bHeight-1;
if not WriteConsoleOutputW(hConsole, @Buffer^[BufferInfo.dwSize.X*bCurrentLine*SizeOf(CHAR_INFO)], CCOORD(bWidth, bHeight),
CCOORD(0, 0), WriteRegion) then
RaiseLastOSError;
bCurrentLine:=bCurrentLine+bHeight;
if bCurrentLine+bHeight>BufferInfo.dwSize.Y then
bHeight:=BufferInfo.dwSize.Y-bCurrentLine;
until bHeight<=0;
Win32Check(SetConsoleCursorPosition(hConsole, BufferInfo.dwCursorPosition));
Win32Check(SetConsoleWindowInfo(hConsole, True, BufferInfo.srWindow));
finally
ReallocMem(Buffer, 0);
end;
end;
Как внедрить, спроси у гугля.
вп (2006-11-07 09:19:00) [2]Сделал "тупым резидентом". Вы будете смеяться, но все это - для терминала Western Union... Там при оплате нужно печатать какой-то код, который выводится на экран. А у машин(именно машин ! из одной партии) какой-то прикол с Shift-PrintScreen - не печатает... Просто гонит бумагу. Я уже за.. возле девочки-оператора(тетки точнее, 50-летней :-) ) торчать и рассказывать, как выделить, скопировать в файл и файл распечатать. А программа не предусматривает печати(там даже телефоны "прошиты" в EXE и все на англицком(тетки балдеют))...А устранить этот глюк с машинами - так и не удалось.Звонил и на фирму, которая собирала эти тачки - там только руками разводят...
А все равно - интересно, как это сделать под "форточками"
BiN (2006-11-04 20:23:00) [3]
> Ketmar © (04.11.06 19:06) [10]
>
> к тому же DetachConsole()
> не существует (где логика -- я не понял %-).
A process can use the FreeConsole function to detach itself from its console.
(c)
> вопрос же не только для хрюкалки.
W2k в списке интересующих систем не увидел. А масдайка сдох.
guav (2006-11-04 19:19:00) [4]А консольное приложение рисует какие-то окошки, или просто выводит строки подряд ?
Во втором случае достаточно запустить с перенаправлением ввода к себе.
Ketmar (2006-11-04 19:06:00) [5]>[9] BiN(c) 3-Nov-2006, 14:40
>В случае с XP внедрять ничего не нужно - достаточно
>получить доступ к консоли с помощью AttachConsole и
>считать ее содержимое.
вопрос же не только для хрюкалки. к тому же DetachConsole() не существует (где логика -- я не понял %-).
BiN (2006-11-03 14:40:00) [6]
> вп (02.11.06 23:36) [4]
>
> И как можно это дело в ДОС-приложение внедрить ?!. Да и
> не только в ДОС, в любое...
В случае с XP внедрять ничего не нужно - достаточно получить доступ к консоли с помощью AttachConsole и считать ее содержимое.
Elen (2006-11-03 11:53:00) [7]
> мне нужно с него (с изображения) снять копию и отослать
> на печать.
Сделай скриншот ДОС окна через BitBlt в файл и его распечатывай
Ketmar (2006-11-03 01:37:00) [8]таки DOS. уже лучше. напиши тупой резидент на асме. дел-то... или драйвер для ntvdm.
вп (2006-11-02 23:47:00) [9]Есть ЧУЖОЕ приложение ДОС, мне нужно с него (с изображения) снять копию и отослать на печать. Вот и все. И печатать на матричнике в текстовом режиме очень желательно...
Ketmar (2006-11-02 23:38:00) [10]о. с каждым разом открываются новые ньюансы задачи. как всегда -- постов через 500 доберёмся до сути...
вп (2006-11-02 23:36:00) [11]И как можно это дело в ДОС-приложение внедрить ?!. Да и не только в ДОС, в любое...
Ketmar (2006-11-02 23:33:00) [12]в общем случае -- внедрением своего кода в чужой процесс.
вп (2006-11-02 23:08:00) [13]Прикинь ! Не знал. СПАС !!!! А справа что за три кнопочки ? Красивые такие. Одна черточка, за ней квадратики и крестик, последняя
По теме. Имелось ввиду программно... Типа
SelectAll;
CopyToClipBoard;
Ketmar (2006-11-02 23:00:00) [14]там это... в левом верхнем углу такая иконочка есть. если на ней кликнуть, менюшка будет. а в менюшке куча интересного.