Форум: "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.039 c