Thema: Delphi Unsichtbares Programm

Einzelnen Beitrag anzeigen

Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#14

Re: Unsichtbares Programm

  Alt 7. Mai 2008, 01:37
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.
  Mit Zitat antworten Zitat