keybd_event( VK_CONTROL, Mapvirtualkey( VK_CONTROL, 0 ), 0, 0);
keybd_event( Ord('C'), MapVirtualkey( Ord('C'), 0 ), 0, 0 );
keybd_event( Ord('C'), MapVirtualkey( Ord('C'), 0 ),KEYEVENTF_KEYUP,
0 );
keybd_event( VK_CONTROL, Mapvirtualkey( VK_CONTROL,
0 ),KEYEVENTF_KEYUP, 0);
Но хотелось бы оформить это через сообщения Форточек:
SendMessage(handle1,WM_KEYDOWN,VK_CONTROL,0);
SendMessage(handle1,WM_KEYDOWN,Ord('C'),0);
SendMessage(handle1,WM_KEYUP,Ord('C'),0);
SendMessage(handle1,WM_KEYUP,VK_CONTROL,0);
Тока беда в том, что не пашут эти SendMessage. Хендл верный, проверял не раз
(да и в случае неверного хендла не работал бы первый подход копирования в
буфер, т.к. перед этим устанавливаю фокус на контрол, с которого будет
осуществляться копирование)
И еще: после копирования в буфер пришлось поставить в цикле считывание из
буфера, т.к. сразу не считаешь: выдаст ошибку: невозможно открыть буфер.
Тока беда в том, что сам цикл что-то долговато крутится (несколько секунд),
что само по себе нехорошо для юзверя.
succ:=FALSE;
while not succ do begin
try
Result:=Trim(Clipboard.AsText);
succ:=TRUE;
except
end;
end;
Ну и чтобы точно "доканать" :) вас вопросами:
хотелось бы перед тем, как копировать текст, сохранить содержимое буфера и
после своих операций воостановить его, дабы пользователь не заметил подставы
(что все это делается через буфер).
Может у кого-то есть какие-то идеи? Буду очень признателен.
:))
> И еще: после копирования в буфер пришлось поставить в цикле считывание из
> буфера, т.к. сразу не считаешь: выдаст ошибку: невозможно открыть буфер.
> Тока беда в том, что сам цикл что-то долговато крутится (несколько
секунд),
> что само по себе нехорошо для юзверя.
> succ:=FALSE;
> while not succ do begin
> try
> Result:=Trim(Clipboard.AsText);
> succ:=TRUE;
> except
> end;
> end;
>
О! По поводу этого вопроса разобрался.
Перед строкой:
Result:=Trim(Clipboard.AsText);
поставил:
Application.ProcessMessages;
И пашет быстренько, без задержек
:))))
> Для того, чтобы загнать текст в буфер, делаю "имитацию" нажатия Ctrl+C
> следющим образом:
> keybd_event( VK_CONTROL, Mapvirtualkey( VK_CONTROL, 0 ), 0, 0);
..
Мало тебе испорченного клипборда, ты еще и фокус хочешь захватить :)
> Hо хотелось бы оформить это через сообщения Форточек:
> SendMessage(handle1,WM_KEYDOWN,VK_CONTROL,0);
> SendMessage(handle1,WM_KEYDOWN,Ord('C'),0);
..
Далеко не все клавиатурные события отображаются в очереди синхронных
сообщений,
т.е., искомую комбинацию не получить с помощью только Send и PostMessage.
Вот, например, как можно послать нажатие ^C:
procedure TForm1.Button1Click(Sender: TObject);
var
KeyState: TKeyboardState;
OldCtrl: byte;
tid: DWORD;
begin
tid := GetWindowThreadProcessID(h, nil); // h - хендл контрола
AttachThreadInput(GetCurrentThreadId, tid, True);
GetKeyboardState(KeyState);
OldCtrl := KeyState[VK_CONTROL];
KeyState[VK_CONTROL]:=$80;
SetKeyboardState(KeyState);
SendMessage (h, WM_KEYDOWN, Ord('C'), 0);
SendMessage(h, WM_CHAR, Ord(^C), 0); {одной(!) этой строки достаточно для
EDIT}
SendMessage (h, WM_KEYUP, Ord('C'), 0);
KeyState[VK_CONTROL]:=OldCtrl;
SetKeyboardState(KeyState);
AttachThreadInput(GetCurrentThreadId,tid,false);
end;
Hо, для RichEdit и Word-редактора (другие не проверял) достаточно простого
SendMessage(h, WM_COPY, 0, 0);
> хотелось бы перед тем, как копировать текст, сохранить содержимое буфера и
> после своих операций воостановить его, дабы пользователь не заметил подставы
А вот оно, к сожалению, в общем случае не решаемо.
Т.е., клипборд может содержать некоторый объект, который будет непонятен
твоему приложению. Hу, и даже, если он будет содержать простую картинку,
то ее постоянные сохранение/восстановление - напрасный труд.
> Может у кого-то есть какие-то идеи? Буду очень признателен.
Спрашивать у юзера, не хочет ли он предоставить клипборд твоему
нетленному творению ;)
--
С уважением, LVT.
AP> Подобные программы не то что идут в корзину, но бывают и поинтереснее
AP> варианты если создатель оказывается в пределах досягаемости.
> :))
> Hееее. Hадеюсь, в корзину не пойдет.
> У меня прога должна работать по примеру Лингво, т.е "хватать" выделенный
> текст для того, чтобы найти соответствующие ему записи в базе
Из двух зол корзина выглядит предпочтительней.
Вот, например, фокус тоже считал себя в безопасности :)
--
С уважением, LVT.
MA> Hееее. Hадеюсь, в корзину не пойдет.
LT> Из двух зол корзина выглядит предпочтительней.
> А что делать?
> Руководство требует, а мое дело маленькое: делать.
> :)))
IMHO, членовредительство непочтительно к званиям и должностям.
Hу, если дело в досягаемости, то, конечно, отвечать будет самый
крайний, т.е., самый ближайший ;)
А если серьезно, покажи начальству тот же Babylon, заставь задуматься:
почему же его разработчики решили пойти таким путем.
Кстати, российская школа OCR, IMHO, до сих пор неплоха, так что присмотрись
внимательней к Лингво, может и он не так прост, как показалось.
--
С уважением, LVT.
Скоро прогу дадут бета-тестерам. Так что посмотрим, жив ли я буду после :)
> А если серьезно, покажи начальству тот же Babylon, заставь задуматься:
> почему же его разработчики решили пойти таким путем.
> Кстати, российская школа OCR, IMHO, до сих пор неплоха, так что
присмотрись
> внимательней к Лингво, может и он не так прост, как показалось.
Начальство об этом знает. Но сам процесс распознавания довольно таки хренов.
Ведь текст может быть подчеркнут, перечеркнут. Т.е. могут присутствовать
очень много левых символов, которые будут мешать. Тем более, что OCR
привязан к языку. А у меня прога должна работать с разными языками:
арабский, китайский, японский, русский, немецкий, французский и т.д. (в
общем все языки, на которых есть продукты Microsoft). Т.е. Babylon отдыхает.
А Лингво действительно процесс передачи осуществляет достаточно примитивно:
делает имитацию Ctrl+C.
LT> IMHO, членовредительство непочтительно к званиям и должностям.
LT> Hу, если дело в досягаемости, то, конечно, отвечать будет самый
LT> крайний, т.е., самый ближайший ;)
> Скоро прогу дадут бета-тестерам. Так что посмотрим, жив ли я буду после :)
Думаю, что от тестеров не стоит ждать насилия над личностями разработчиков, но,
если внимательно прислушаться к их мнению, угадать последствия релизов можно.
> Hачальство об этом знает. Hо сам процесс распознавания довольно таки хренов.
> Ведь текст может быть подчеркнут, перечеркнут. Т.е. могут присутствовать
> очень много левых символов, которые будут мешать. Тем более, что OCR
> привязан к языку. А у меня прога должна работать с разными языками:
> арабский, китайский, японский, русский, немецкий, французский и т.д. (в
> общем все языки, на которых есть продукты Microsoft). Т.е. Babylon отдыхает.
Я насчитал у Babylon словарей для более 70 языков, включая арабский,
корейский,
японский, урду, зулу и т.д. Привязка к языку, естественно, важна для обратной
связи
в процессе распознавания, но без этой привязки, все равно, толку не очень
много.
Т.е., имеет ли смысл коллекционировать бессмысленные наборы символов, которые,
к тому же, могут быть зачеркнутыми и т.д.
> А Лингво действительно процесс передачи осуществляет достаточно примитивно:
> делает имитацию Ctrl+C.
И это значит, что мы не можем его рекомендовать в качестве прототипа.
--
С уважением, LVT.
На них вохлагаем надежды относительно улучшения продукта :))))
> Я насчитал у Babylon словарей для более 70 языков, включая арабский,
> корейский,
> японский, урду, зулу и т.д. Привязка к языку, естественно, важна для
обратной
> связи
> в процессе распознавания, но без этой привязки, все равно, толку не очень
> много.
> Т.е., имеет ли смысл коллекционировать бессмысленные наборы символов,
которые,
> к тому же, могут быть зачеркнутыми и т.д.
Ни о каком коллекционировании речь не идет. Моей проге нужен только текст
(без форматирования) для того, чтобы найти его в базе. Всего то делов.
И я уверен, что глюков у этого Babylon в процессе распознавания не меньше,
чем волос на моей голове. :)))))
Ничто не совершенно. Никто не совершенен!
;-)
LT> Думаю, что от тестеров не стоит ждать насилия над личностями
> Hа них вохлагаем надежды относительно улучшения продукта :))))
Самим-то плошать не стоит.
LT> Т.е., имеет ли смысл коллекционировать бессмысленные наборы символов,
> Hи о каком коллекционировании речь не идет. Моей проге нужен только текст
> (без форматирования) для того, чтобы найти его в базе. Всего то делов.
Hаверное, в базе хранится нечто осмысленное, а, значит, существенных отличий
от обратной связи в OCR, IMHO, и нет.
> И я уверен, что глюков у этого Babylon в процессе распознавания не меньше,
> чем волос на моей голове. :)))))
> Hичто не совершенно. Hикто не совершенен!
> ;-)
Hо стремлениям к совершенству пределов нет.
--
С уважением, LVT.
Стараемся :)