FAQ VCL
Буфер обмена

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как скопировать текст в буфер обмена без использования модуля Clipbrd?

function SetClipboardText( Wnd: HWND; Value: string ): boolean;
var
  hData: HGlobal;
  pData: Pointer;
  Len: Integer;
begin
  Result := True;

  if OpenClipboard(Wnd) then
  begin
    try
      Len := Length(Value) + 1;
      hData := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Len);
      try
        pData := GlobalLock(hData);
        try
          Move(PChar(Value)^, pData^, Len);
          EmptyClipboard;
          SetClipboardData(CF_Text, hData);
        finally
          GlobalUnlock(hData);
        end;
      except
        GlobalFree(hData);
        raise;
      end;
    finally
      CloseClipboard;
    end;
  end
  else
    Result := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetClipboardText(Handle, 'qwerty');
end;


Как получить текст из буфера обмена без использования модуля Clipbrd?

function GetClipboardText(Wnd: HWND; var Str: string): Boolean;
var
  hData: HGlobal;
begin
  Result := True;
  if OpenClipboard(Wnd) then
  begin
    try
      hData := GetClipboardData(CF_TEXT);
      if hData <> 0 then
      begin
         try
           SetString(Str, PChar(GlobalLock(hData)), GlobalSize(hData));
         finally
           GlobalUnlock(hData);
         end;
       end
       else
         Result := False;
       Str := PChar(@Str[1]);
     finally
       CloseClipboard;
     end;
  end
  else
    Result := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Str: string;
begin
  GetClipboardText(Handle, Str);
  ShowMessage(Str);
end;


Как получить имена файлов из буфера обмена?

uses
  ClipBrd, ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
  f: THandle;
  Buffer: array [0..MAX_PATH] of Char;
  i, numFiles: Integer;
begin
  Clipboard.Open;
  try
    f := Clipboard.GetAsHandle(CF_HDROP) ;
    if f <> 0 then
    begin
      numFiles := DragQueryFile(f, $FFFFFFFF, nil, 0);
      Memo1.Clear;
      for i := 0 to numFiles-1 do
      begin
        Buffer[0] := #0;
        DragQueryFile(f, i, Buffer, SizeOf(Buffer));
        Memo1.Lines.Add(Buffer);
      end;
    end;
  finally
    Clipboard.Close;
  end;
end;


Как поместить скриншот формы в буфер обмена?

procedure TForm1.Button1Click(Sender: TObject);
begin
  keybd_event(VK_SNAPSHOT, 1, 0, 0);
  keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);
end;


Как скопировать текст в буфер обмена?

uses
  Clipbrd;

type
  TClipboardAccess = class(TClipboard);

implementation

procedure CopyToClipboard(const aText: string);
var
  wText: WideString;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    wText := aText;
    TClipboardAccess(Clipboard).SetBuffer(CF_UNICODETEXT, wText[1], (Length(wText) + 1) * 2);
  end
  else
    Clipboard.AsText := aText;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyToClipboard('Произвольный текст');
end;

При использовании материала - ссылка на сайт обязательна