Den Tipp mit der eigenen Implementation einer Clipboard-Routine habe ich umgesetzt und dadurch die "Clipbrd"-
Unit eingespart.
Quelle:
"mittels API Text in die Zwischenablage schreiben". (Danke an OrallY!)
Hier meine Lösung:
Zur Veranschaulichung (gibts das Wort?) habe ich die Compiler Direktive für den Konsolen-AppTyp nur auskommentiert und ein ShowMessage eingebaut.
Eine Frage zum Befehl "OpenClipboard(0);":
Im Original-Tipp (siehe Quelle oben) wurde davon ausgegangen, dass dort das
Handle der eigenen Form angegeben wird. Da mein unsichtbares Programm aber keine Form hat, habe ich 0 eingetragen. Ist das so in Ordnung, oder gibt das Querschläger, die im ersten Moment nicht sichtbar sind? Soll ich besser ein
Handle verwenden? Z. B. per "GetDesktopWindow()"?
Delphi-Quellcode:
program Project1;
//{$APPTYPE CONSOLE}
uses
Windows;
// Routine zum Speichern eines Textes in die Zwischenablage
procedure SetClipboardText(aText: PChar);
procedure SetBuffer(Format: Word; var Buffer; Size: Integer);
var
Data: THandle;
DataPtr: Pointer;
begin
OpenClipboard(0); //Clipboard wird für die Anwendung geöffnet (hWnd muss das Fensterhandle sein)
try
EmptyClipboard; // !Wichtig! Nur so kann das oben angegebene Fenster der "Besitzer" des Clipboards werden
Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Size);
try
DataPtr := GlobalLock(Data);
try
Move(Buffer, DataPtr^, Size);
SetClipboardData(Format, Data);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
raise;
end;
finally
CloseClipboard; //und wieder den Clipboard freigeben
end;
end;
begin
SetBuffer(CF_TEXT, aText^, Length(aText) + 1);
end;
// Main-Routine
begin
{ TODO -oUser -cConsole Main : Insert code here }
if (ParamCount() > 0) then
begin
SetClipboardText(PChar(ParamStr(1)));
// ShowMessage('ParamCount(): ' + PChar(IntToStr(ParamCount()) + #13#10 +
// 'ParamStr(0): ' + ParamStr(0) + #13#10 +
// 'ParamStr(1): ' + ParamStr(1)));
end;
end.