Как скинуть в буфер обмена(Ctrl+C) текстовую информацию?
Ты имеешь в виду программно? Или чтоб скопировать текст программы из окна в ClipBoard? Программно - надо смотреть (опять же, программа оконная или консоль)... Если чтоб скопировать - то Edit -> Copy To Windows
Надо програмно из консоля. Возможно?
Я думаю, да... Сейчас гляну...
Значится, так:
первая часть реализована у Vit-а в DRKB:
Системные функции и WinAPI -> Windows -> Консольные приложения -> Как захватить весь вывод в консоли?
(с незначительными переделками возвращает строку, содержащую все, что было записано в консоль), а вот со второй частью (а именно - сам процесс копирования в ClipBoard) есть проблемы... Нужно передавать в OpenClipboard() Application.Handle, которого, как ты понимаешь, у консольного приложения нет в том виде, как у приложения оконного... Да и юнита ClipBrd нет в FreePascal-е, ибо это часть VCL...
volvo
а в fcl или lcl аналог есть? В fcl нашел только clipboard в gtk2 и под morphos.
uses windows, sysutils;
const
size = 80 * 50;
var
chiBuffer: string;
hStdOut: THandle;
rd: LongWord;
buf: array[0 .. pred(size)] of char;
function GetConsoleWindow: THandle;
var
S: AnsiString;
C: Char;
begin
Result := 0;
Setlength(S, MAX_PATH + 1);
if GetConsoleTitle(PChar(S), MAX_PATH) <> 0 then
begin
C := S[1];
S[1] := '$';
SetConsoleTitle(PChar(S));
Result := FindWindow(nil, PChar(S));
S[1] := C;
SetConsoleTitle(PChar(S));
end;
end;
procedure grabber();
var
Data: THandle;
DataPtr: Pointer;
len: integer;
crd: TCoord;
i: integer;
begin
crd.X := 0;
crd.Y := 0;
hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
ReadConsoleOutputCharacter(hStdout, buf, size, crd, rd);
chiBuffer := '';
for i := 0 to pred(rd) do begin
chiBuffer := chiBuffer + buf[i];
if succ(i) mod 80 = 0 then chiBuffer := chiBuffer + #13#10;
end;
if OpenClipboard(GetConsoleWindow) then
try
{ opening clipboard succeeded... }
len := Length(chiBuffer) + 1;
Data := GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, len);
try
DataPtr := GlobalLock(Data);
try
Move(pchar(chiBuffer)^, DataPtr^, len);
EmptyClipboard;
SetClipboardData(CF_TEXT, Data);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
end;
finally
CloseClipboard;
end;
end;
var
i: integer;
begin
{ Заполняем чем-то экран }
for i := 1 to 10 do
writeln('Wow !!! Wow !!! Wow !!! ', i);
{ и забираем его содержимое в буфер }
grabber;
end.
Ух, спасибо большое , сейчас буду разбираться, только не мог бы ты выложить файл с исходником - при копирование форматирования пропадает.
Компиляция не проходит...
Ide ругается на 66 строчку - Move(pchar(chiBuffer)^, DataPtr^, len);
А у тебя совместимость с Delphi установлена в настройках? Если нет, то первой строкой программы добавляй
{$mode DELPHI}
Спаибо Volvo, теперь все работает . Компилятор и раньше писал что-то про mode, только я поставил вместо {$mode DELPHI} {$mode ObjFpc}.
Осталось несколько моментов, которые я не понял:
{ Это уже есть в программе ... }
chiBuffer := '';
for i := 0 to pred(rd) do begin
chiBuffer := chiBuffer + buf[i];
if succ(i) mod 80 = 0 then chiBuffer := chiBuffer + #13#10;
end;
{ А вот это надо добавить ... }
while pos(' '#13#10, chiBuffer) > 0 do
chibuffer := stringreplace(chibuffer, ' '#13#10, #13#10, [rfreplaceall]);
...