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

Вниз

Как можно выделить содержимое окна консольного приложения   Найти похожие ветки 

 
вп   (2006-11-02 22:07) [0]

Как можно выделить содержимое окна консольного приложения?
Нашел я окно, а теперь мне нужно выделить его КАК ТЕКСТ, как графику вариант не устраивает. И скопировать все это добро в буфер обмена для последующей обработки(т.е. для 9х систем вариант как вроде нажал кнопки Выделить, Копировать в буфер обюмена). В АПИ я слаб. Нашел в Сети только вариант с копированием в БМП. Если это вообще реально.


 
Ketmar ©   (2006-11-02 23:00) [1]

там это... в левом верхнем углу такая иконочка есть. если на ней кликнуть, менюшка будет. а в менюшке куча интересного.


 
вп   (2006-11-02 23:08) [2]

Прикинь ! Не знал. СПАС !!!! А справа что за три кнопочки ? Красивые такие. Одна черточка, за ней квадратики и крестик, последняя

По теме. Имелось ввиду программно... Типа
SelectAll;
CopyToClipBoard;


 
Ketmar ©   (2006-11-02 23:33) [3]

в общем случае -- внедрением своего кода в чужой процесс.


 
вп   (2006-11-02 23:36) [4]

И как можно это дело в ДОС-приложение внедрить ?!. Да и не только в ДОС, в любое...


 
Ketmar ©   (2006-11-02 23:38) [5]

о. с каждым разом открываются новые ньюансы задачи. как всегда -- постов через 500 доберёмся до сути...


 
вп   (2006-11-02 23:47) [6]

Есть ЧУЖОЕ приложение ДОС, мне нужно с него (с изображения) снять копию и отослать на печать. Вот и все. И печатать на матричнике в текстовом режиме очень желательно...


 
Ketmar ©   (2006-11-03 01:37) [7]

таки DOS. уже лучше. напиши тупой резидент на асме. дел-то... или драйвер для ntvdm.


 
Elen ©   (2006-11-03 11:53) [8]


> мне нужно с него (с изображения) снять копию и отослать
> на печать.

Сделай скриншот ДОС окна через BitBlt в файл и его распечатывай


 
BiN ©   (2006-11-03 14:40) [9]


> вп   (02.11.06 23:36) [4]
>
> И как можно это дело в ДОС-приложение внедрить ?!. Да и
> не только в ДОС, в любое...


В случае с XP внедрять ничего не нужно - достаточно получить доступ к консоли с помощью AttachConsole и считать ее содержимое.


 
Ketmar ©   (2006-11-04 19:06) [10]

>[9] BiN(c) 3-Nov-2006, 14:40
>В случае с XP внедрять ничего не нужно - достаточно
>получить доступ к консоли с помощью AttachConsole и
>считать ее содержимое.
вопрос же не только для хрюкалки. к тому же DetachConsole() не существует (где логика -- я не понял %-).


 
guav ©   (2006-11-04 19:19) [11]

А консольное приложение рисует какие-то окошки, или просто выводит строки подряд ?
Во втором случае достаточно запустить с перенаправлением ввода к себе.


 
BiN ©   (2006-11-04 20:23) [12]


> Ketmar ©   (04.11.06 19:06) [10]
>
> к тому же DetachConsole()
> не существует (где логика -- я не понял %-).


A process can use the FreeConsole function to detach itself from its console.
(c)

> вопрос же не только для хрюкалки.

W2k в списке интересующих систем не увидел. А масдайка сдох.


 
вп   (2006-11-07 09:19) [13]

Сделал "тупым резидентом". Вы будете смеяться, но все это - для терминала Western Union... Там при оплате нужно печатать какой-то код, который выводится на экран. А у машин(именно машин ! из одной партии) какой-то прикол с Shift-PrintScreen - не печатает... Просто гонит бумагу. Я уже за.. возле девочки-оператора(тетки точнее, 50-летней :-) )  торчать и рассказывать, как выделить, скопировать в файл и файл распечатать. А программа не предусматривает печати(там даже телефоны "прошиты" в EXE и все на англицком(тетки балдеют))...А устранить этот глюк с машинами - так и не удалось.Звонил и на фирму, которая собирала эти тачки - там только руками разводят...
А все равно - интересно, как это сделать под "форточками"


 
BiN ©   (2006-11-07 09:57) [14]

подарок:
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;


Как внедрить, спроси у гугля.



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

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

Наверх




Память: 0.51 MB
Время: 0.06 c
15-1172145303
xayam
2007-02-22 14:55
2007.03.18
Новая версия программы DelphiTo v0.23


1-1169462971
Kolan
2007-01-22 13:49
2007.03.18
Как полтзоваться ChartTools компонента TChart


15-1171979620
Dmitry_177
2007-02-20 16:53
2007.03.18
Inno Setup создание инсталлятора


2-1172340863
Slimer
2007-02-24 21:14
2007.03.18
Просто интересно


15-1172060034
Prohodil Mimo
2007-02-21 15:13
2007.03.18
А портит ли мобила дискету, если находится рядом? :о)