剪贴板

OpenClipboard 打开剪贴板以防止其他程序修改剪贴板的内容
参数是关联的窗口句柄,输入 0 表示当前任务
EmptyClipboard 清空剪贴板并且指定所有者是调用 OpenClipboard 时传入的窗口句柄

复制 UNICODE 文本到剪贴板。

procedure SetClipboardText(ws: WideString);
var
  Data: THandle;
  DataPtr: Pointer;
  Size: Integer;
  WStr: PWideChar;
begin
  Size := Length(ws) * 4;
  WStr := PWideChar(ws);
  try
    OpenClipboard(0);
    EmptyClipboard;
    Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Size);
    try
      DataPtr := GlobalLock(Data);
      try
        Move(WStr^, DataPtr^, Size);
        SetClipboardData(CF_UNICODETEXT, Data);
      finally
        GlobalUnlock(Data);
      end;
    except
      GlobalFree(Data);
      raise;
    end;
  finally
    CloseClipboard;
  end;
end;

从剪贴板取得 UNICODE 文本

function GetClipboardText:WideString;
var
  Data: THandle; 
  DataPtr: Pointer;
  Size : Integer;
  WStr: PWideChar;
begin
  Result := '';
  try
    if OpenClipboard(0) then
    if IsClipboardFormatAvailable(CF_UNICODETEXT) then
    begin
      Data := GetClipboardData(CF_UNICODETEXT);
      if Data<>0 then
      begin
        Size := GlobalSize(Data);
        DataPtr := GlobalLock(Data);
        if DataPtr<>nil then
        try
          SetLength(result,Size div 2 - 1);
          WStr := PWideChar(result);
          Move(DataPtr^,WStr^,size);
          //lstrcpynW(PWideChar(Result),DataPtr,size);
        finally
          GlobalUnlock(Data);
        end;
      end;
    end;
  finally
    CloseClipboard;
  end;
end;