Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.048 c
1-1129609852
7#Z$Ad!*7
2005-10-18 08:30
2005.11.06
Не работает TopItem в компоненте TTreeView


2-1128595845
norwikh
2005-10-06 14:50
2005.11.06
В Win98 проекты ведут себя весьма странно


4-1125777895
SamProf
2005-09-04 00:04
2005.11.06
Управлять активным Editom не на своей форме!


9-1119729614
Ford
2005-06-26 00:00
2005.11.06
GTA dff


3-1127744907
Malamba
2005-09-26 18:28
2005.11.06
запрос с параметрами вымахивается





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский