Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

History буфера обмена [D6, Win2k]


Whippi ©   (2002-11-25 17:36:00) 

Кто нибудь сталкивался с такой вещью?
Как это можно риализовать?
Примерчиком неподмогнете?


Whippi   (2002-11-26 09:36:00) [1]

Спасибо огромное.


MBo   (2002-11-26 09:26:00) [2]

Сохранение всего содержимого буфера обмена в файл.
Сам факт изменения отслеживается с помощью указанных SottNick функций. И учти, что в момент восстановления форматы, записанные в сейве, должны быть известны (зарегистрированы) Windows

var FS:TFileStream;

procedure TForm1.bClearClick(Sender: TObject);
begin
OpenClipBoard(0);
EmptyClipboard;
CloseClipBoard;
end;

procedure TForm1.BSaveClick(Sender: TObject);
var CBF:Cardinal;
CBFList:TList;
i:Integer;
h:THandle;
p:Pointer;
CBBlockLength,Temp:Cardinal;
FS:TFileStream;
begin
if OpenClipBoard(0)then begin
CBFList:=TList.Create;
CBF:=0;
repeat
CBF:=EnumClipboardFormats(CBF);
if CBF<>0 then
CBFList.Add(pointer(CBF));
until CBF=0;
edit1.text:=IntToStr(CBFList.Count);
if CBFList.Count>0 then begin
FS:=TFileStream.Create("e:\cp.dat",fmCreate);
Temp:=CBFList.Count;
FS.Write(Temp,SizeOf(Integer));
for i:=0 to CBFList.Count-1 do begin
h:=GetClipboardData(Cardinal(CBFList[i]));
if h>0 then begin
CBBlockLength:=GlobalSize(h);
if h>0 then begin
p:=GlobalLock(h);
if p <> nil then begin
Temp:=Cardinal(CBFList[i]);
FS.Write(Temp,SizeOf(Cardinal));
FS.Write(CBBlockLength,SizeOf(Cardinal));
FS.Write(p^,CBBlockLength);
end;
GlobalUnlock(h);
end;
end;
end;
FS.Free;
end;
CBFList.Free;
CloseClipBoard;
end;
end;

procedure TForm1.bLoadClick(Sender: TObject);
var h:THandle;
p:Pointer;
CBF:Cardinal;
CBBlockLength:Cardinal;
i,CBCount:Integer;
FS:TFileStream;
begin
if OpenClipBoard(0)then begin
FS:=TFileStream.Create("e:\cp.dat",fmOpenRead);
if FS.Size=0 then Exit;
FS.Read(CBCount,sizeOf(Integer));
if CBCount=0 then Exit;
for i:=1 to CBCount do begin
FS.Read(CBF,SizeOf(Cardinal));
FS.Read(CBBlockLength,SizeOf(Cardinal));
h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT,CBBlockLength);
if h>0 then begin
p:=GlobalLock(h);
if p=nil then
GlobalFree(h)
else begin
FS.Read(p^,CBBlockLength);
GlobalUnlock(h);
SetClipboardData(CBF,h);
end;
end;
end;
FS.Free;
CloseClipBoard;
end;
end;


SottNick   (2002-11-26 09:15:00) [3]

message WM_CHANGECBCHAIN;
message WM_DRAWCLIPBOARD;

и конечно
SetClipboardViewer(Handle);
ChangeClipboardChain(Handle, PrevHwnd);


Дмитрий К.К.   (2002-11-26 09:06:00) [4]

Библиотека RX

TClipboardMonitor component

This object allows for clipboard monitoring.

Once the object is created, you must supply an event handler to be warned when the clipboard contents change.


Whippi   (2002-11-26 08:57:00) [5]


> MBo © (25.11.02 17:48)
> поройся по форуму, я выкладывал код сохранения содержимого
> clipBoard в файл и восстановления. Учти, что некоторые программы
> используют отложенное копирование (render), когда данные
> не хранятся в буфере, а поставляются по запросу

Прощерстил форум на месяц назад, но увы не нашел примера. Немогли бы Вы повторить его?


MBo   (2002-11-25 17:48:00) [6]

поройся по форуму, я выкладывал код сохранения содержимого clipBoard в файл и восстановления. Учти, что некоторые программы используют отложенное копирование (render), когда данные не хранятся в буфере, а поставляются по запросу


Наверх

Титульная страница Поиск, карта сайта Написать письмо