Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Почему не удается восстановить буфер обмена ?   Найти похожие ветки 

 
leonidus ©   (2005-10-10 13:07) [0]

Делаю так:

clipboard_status:=Clipboard.AsText; //сохраняем содержиое буфера

//посылаем CTRL+C
keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_EXTENDEDKEY,0);
           keybd_event(Ord("C"),0,0,0);
           keybd_event(Ord("C"),0,KEYEVENTF_KEYUP,0);
           keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY,0);
Sleep(200);
Clipboard.GetTextBuf(Words,MaxWordLength);

//получаемслово из буфера
find_word:= trim(Words);
sleep(100);

//восстанавливаем инфу в буфере обмена
flag:=false;
repeat
try
Clipboard.SetTextBuf(pchar(clipboard_status));
flag:=true;
except
end;
sleep(100);
until flag;

выделенный текст копируется в буфер прекрасно, однако при восстановлении даже не смотря на try/except получаю ошибку "Cannot open clipboard", в чем же дело, почему не удается в буфер вернуть строчку?


 
Palladin ©   (2005-10-10 13:14) [1]

простой вопрос. зачем тебе это нужно?


 
leonidus ©   (2005-10-10 13:19) [2]

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


 
leonidus ©   (2005-10-10 14:51) [3]

Люди, неужели никто не сталкивался с подобной проблемой?


 
Leonid Troyanovsky ©   (2005-10-10 15:20) [4]


> leonidus ©   (10.10.05 13:19) [2]
> простой ответ: программа по хот кею должна получить выделенное
> юзером слово, а так как она для этого копирует слово в буфер,
>  то после того как слово получено буфер было бы правильней
> восстановить.


А почему ты думаешь, что в буфере был текст?
Скорее всего, там будут данные в том формате, в котором его сохранили.
И знать его, видимо, будет то приложение, которое его сохранило.

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

Решения же этой проблемы лежат в диапазоне от изучения всех
контролов, могущих отдать текст минуя буфер обмена (например,
WM_GETTEXT), до применения OCR к выделенной картинке.

--
Regards, LVT.


 
Набережных С. ©   (2005-10-10 18:00) [5]


> Leonid Troyanovsky ©   (10.10.05 15:20) [4]


> Скорее всего, там будут данные в том формате, в котором
> его сохранили.
> И знать его, видимо, будет то приложение, которое его сохранило.
>


Ну это вроде несложно:) Нижеприведенный код работает, когда в буфере текст или графика, а дальше мне тестировать лень:))

. Только сам тестируй, мне лень.

var
 MS: TMemoryStream;

type
 TSaveClipboardHeader = packed record
   cbFormat: Cardinal;
   DataSize: Cardinal;
 end;
 PSaveClipboardHeader = ^TSaveClipboardHeader;

procedure SaveClipboard(Stm: TStream);
var
 H: HGlobal;
 Hdr: TSaveClipboardHeader;
 P: PByte;
 Fmt: Cardinal;
begin
 Fmt:=0;
 Clipboard.Open;
 try
   repeat
     Fmt:=EnumClipboardFormats(Fmt);

     if Fmt <> 0 then
     begin
       H:=Clipboard.GetAsHandle(Word(Fmt));

       if H <> 0 then
       begin
         Hdr.cbFormat:=Fmt;
         Hdr.DataSize:=GlobalSize(H);
         Stm.Write(Hdr, SizeOf(Hdr));
         P:=GlobalLock(H);
         try
           Stm.Write(P^, Hdr.DataSize);
         finally
           GlobalUnlock(H);
         end;
       end;
         
     end;
   until Fmt = 0;
 finally
   Clipboard.Close;
 end;
end;

procedure RestoreClipboard(Stm: TStream);
var
 H: HGlobal;
 Hdr: TSaveClipboardHeader;
 P: PByte;
begin
 Clipboard.Open;
 try
   Clipboard.Clear;
   while Stm.Position < Stm.Size do
   begin
     Stm.ReadBuffer(Hdr, SizeOf(Hdr));

     H:=GlobalAlloc(GMEM_MOVEABLE, Hdr.DataSize);
     if H = 0 then RaiseLastOSError;

     P:=GlobalLock(H);
     try
       Stm.ReadBuffer(P^, Hdr.DataSize);
     finally
       GlobalUnlock(H);
     end;
     Clipboard.SetAsHandle(Word(Hdr.cbFormat), H);

   end;
 finally
   Clipboard.Close;
 end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 FreeAndNil(MS);
 MS:=TMemoryStream.Create;
 SaveClipboard(Ms);
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
 if MS <> nil then
 begin
   MS.Position:=0;
   RestoreClipboard(MS);
   FreeAndNil(MS);
 end;
end;


> почему не удается в буфер вернуть строчку?

Видимо. приложение, которое реагирует на keybd_event, еще не закрыло буфер.

> даже не смотря на try/except получаю ошибку

Это потому, что запускаешь под отладчиком.


 
Leonid Troyanovsky ©   (2005-10-10 18:06) [6]


> Набережных С. ©   (10.10.05 18:00) [5]

> Ну это вроде несложно:) Нижеприведенный код работает, когда
> в буфере текст или графика, а дальше мне тестировать лень:
> ))


Хе-хе. Есть, слава Богу, заинтересованные лица - мне ж тоже лень.
А кроме текста или графики там много чего может быть.

--
Regards, LVT.


 
Набережных С. ©   (2005-10-10 18:25) [7]


> Leonid Troyanovsky ©   (10.10.05 18:06) [6]


> . Только сам тестируй, мне лень.

Блин, эту фразу удалить забыл:(( Она - остаток от обращения к автору вопроса, потом передумал, большую часть убрал, а это забыл.
Грубовато получилось, извини.


 
Anatoly Podgoretsky ©   (2005-10-10 20:17) [8]

Не трожь буфер зараза, не твое.
На самом деле буфер гораздо более сложное устройство, чем кажется на первый взгляд. Задача восстановления буфера не тривильная, если вообще выполнимая.


 
leonidus ©   (2005-10-11 08:39) [9]

>Набережных С. большое спасибо за код, поковырял я его - работает в плане копирования в буфер, однако RestoreClipboard вызывает появление окна с сообщением "Cannot open clipboard" причем сообщение появляется даже если я запускаю просто эекзешник, т.е. не из под IDE.

Будем исходить из того что в процессе работы с програмой в буфере может тежать только текст и нечего более. Я вполне могу такое предположить в связи со спецификой моей программы, поэтому какие-то особые ухищрения примнять нет смысла.

>Anatoly Podgoretsky я читал ваши мысли в SWRUS по схожему вопросу, и все прекрасно понимаю, однако программу написать все же необходимо:)


 
TUser ©   (2005-10-11 09:20) [10]

snoop2 - есть такая програмка. Успешно справляется с этой задачей, начиная с какой-то версии. Исходники на Delphi, открытые.


 
leonidus ©   (2005-10-11 09:44) [11]

>TUser вы про эту программу :
http://come.to/golomin
?


 
leonidus ©   (2005-10-11 15:12) [12]

Удалено модератором
Примечание: Создание пустых сообщений


 
Anatoly Podgoretsky ©   (2005-10-11 16:25) [13]

leonidus ©   (11.10.05 08:39) [9]
Будем исходить из того что в процессе работы с програмой в буфере может тежать только текст и нечего более. Я вполне могу такое предположить в связи со спецификой моей программы, поэтому какие-то особые ухищрения примнять нет смысла.

Давай не будем исходить, поскольку не соответсвует и какое отношение твоя программа имеет к Виндоус.


 
TUser ©   (2005-10-11 18:56) [14]

> leonidus ©   (11.10.05 09:44) [11]

Имя автора совпадает. Наверное она. Внутрь ссылки не смотрел.



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
1-1129365346
Jimm
2005-10-15 12:35
2005.11.06
Как заставить показываться Hint на неактивной форме ?


3-1127828240
msguns
2005-09-27 17:37
2005.11.06
Access+Обновление с подсчетом агрегатов


14-1129200288
syte_ser78
2005-10-13 14:44
2005.11.06
как парвильно печатать с Акробата?


2-1129215799
Fast2
2005-10-13 19:03
2005.11.06
Почему при выполнении пишет Transaction is active ?


6-1121975092
redlord
2005-07-21 23:44
2005.11.06
изменить время отведенное на коннект