Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.06.2010, 14:21
Аватар для NekitoSSSS
NekitoSSSS NekitoSSSS вне форума
Начинающий
 
Регистрация: 02.05.2009
Адрес: Башкортостан, г.Благовещенск
Сообщения: 142
Версия Delphi: XE
Репутация: 13
По умолчанию Хендл консольного окна

есть простейшее консольное приложение
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  windows,sysutils;
procedure CopyStringToClipboard(s: string);
var
  hg: THandle;
  P: PChar;
begin
  hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1);
  P:=GlobalLock(hg);
  StrPCopy(P, s);
  GlobalUnlock(hg);
  OpenClipboard(Application.Handle);
  SetClipboardData(CF_TEXT, hg);
  CloseClipboard;
  GlobalFree(hg);
end;

begin
  CopyStringToClipboard('lol');
  Writeln('OK');
  Readln;
end.

но оно даже не компилируется, ругается на строку
OpenClipboard(Application.Handle);

то есть я понимаю тут к хендлу окна прикрепляем открытый буфер обмена... но как это исправить? Без добавления модуля Forms естесно, как узнать handle консольного окна?!
p.s. код копирования в буфер взят из
http://www.delphisources.ru/pages/fa...clipboard.html
но всетаки заголовок той статьи не соответствует коду......
Ответить с цитированием
  #2  
Старый 02.06.2010, 16:11
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows;

procedure SetBuffer(Format: Word; var Buffer; Size: Integer);
var
  Data: THandle;
  DataPtr: Pointer;
begin
  OpenClipboard(0);
  try
    Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Size);
    try
      DataPtr := GlobalLock(Data);
      try
        Move(Buffer, DataPtr^, Size);
        EmptyClipboard;
        SetClipboardData(Format, Data);
      finally
        GlobalUnlock(Data);
      end;
    except
      GlobalFree(Data);
      raise;
    end;
  finally
    CloseClipboard;
  end;
end;

procedure SetAsText(const Value: string);
begin
  SetBuffer(CF_TEXT, PChar(Value)^, Length(Value) + 1);
end;

begin
  SetAsText('Hello Clipboard');
  Writeln('OK');
  Readln;
end.

BOOL OpenClipboard(
HWND hWndNewOwner // handle to window opening clipboard
);

Parameters
hWndNewOwner
Identifies the window to be associated with the open clipboard. If this parameter is NULL, the open clipboard is associated with the current task.
Ответить с цитированием
  #3  
Старый 02.06.2010, 16:25
Аватар для NekitoSSSS
NekitoSSSS NekitoSSSS вне форума
Начинающий
 
Регистрация: 02.05.2009
Адрес: Башкортостан, г.Благовещенск
Сообщения: 142
Версия Delphi: XE
Репутация: 13
По умолчанию

о_0 извращение конечно получается, но за код спс
Ответить с цитированием
  #4  
Старый 02.06.2010, 18:27
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну не знаю на сколько родной код
Код:
unit Clipbrd;
можно считать извращенным:
Код:
  TClipboard = class(TPersistent)
  private
    procedure SetAsText(const Value: string);
  protected
    procedure SetBuffer(Format: Word; var Buffer; Size: Integer);

procedure TClipboard.SetAsText(const Value: string);
begin
  SetBuffer(CF_TEXT, PChar(Value)^, Length(Value) + 1);
end;

procedure TClipboard.SetBuffer(Format: Word; var Buffer; Size: Integer);
var
  Data: THandle;
  DataPtr: Pointer;
begin
  Open;
  try
    Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Size);
    try
      DataPtr := GlobalLock(Data);
      try
        Move(Buffer, DataPtr^, Size);
        Adding;
        SetClipboardData(Format, Data);
      finally
        GlobalUnlock(Data);
      end;
    except
      GlobalFree(Data);
      raise;
    end;
  finally
    Close;
  end;
end;
Ответить с цитированием
  #5  
Старый 15.06.2010, 11:25
coldsv coldsv вне форума
Прохожий
 
Регистрация: 14.06.2010
Сообщения: 2
Репутация: 10
По умолчанию

Код:
TClipboard = class(TPersistent)
  private
    procedure SetAsText(const Value: string);
  protected
    procedure SetBuffer(Format: Word; var Buffer; Size: Integer);

procedure TClipboard.SetAsText(const Value: string);
begin
  SetBuffer(CF_TEXT, PChar(Value)^, Length(Value) + 1);
end;

procedure TClipboard.SetBuffer(Format: Word; var Buffer; Size: Integer);
var
  Data: THandle;
  DataPtr: Pointer;
begin
  Open;
  try
    Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Size);
    try
      DataPtr := GlobalLock(Data);
      try
        Move(Buffer, DataPtr^, Size);
        Adding;
        SetClipboardData(Format, Data);
      finally
        GlobalUnlock(Data);
      end;
    except
      GlobalFree(Data);
      raise;
    end;
  finally
    Close;
  end;
end;
Admin: Пользуемся тегами!

Последний раз редактировалось Admin, 18.11.2010 в 20:33.
Ответить с цитированием
  #6  
Старый 18.11.2010, 19:06
shraibikus shraibikus вне форума
Прохожий
 
Регистрация: 18.11.2010
Сообщения: 1
Репутация: 10
По умолчанию

свое окно
Handle:= GetForegroundWindow;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter