Форум: "Основная";
Текущий архив: 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