Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
вп   (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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.064 c
6-1159770522
Виктор 5
2006-10-02 10:28
2007.03.18
не работает InternetSetFilePointer


15-1171898141
DillerXX
2007-02-19 18:15
2007.03.18
Казино рояль


15-1170999818
MBo
2007-02-09 08:43
2007.03.18
Пятничные задачки. Вася Пупкин потрясает интеллектом...


15-1172322646
Суслик
2007-02-24 16:10
2007.03.18
Delphi Turbo for Win32 Prof VS Delphi for Win32 Prof


4-1162569603
Dmitry_177
2006-11-03 19:00
2007.03.18
Работа с INI-файлами на API





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский