Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [ищу мануал] передача выделенного текста в програм, перехват выделения 
:(
    Опции темы
lazutov
Дата 17.4.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Здравствуйте,
Такой вопрос: как сделать, чтобы при выделении текста(в браузере например)и при нажатии определенных клавиш(ctrl+что-то, например), то что выделено передавалось в программу.
+ чтобы не создавать новую тему: Всем известный квип: как делается всплывающее окошко. Точнее как делается понятно, что за компонент?
Заранее спс.

PS в шапке написанные источники посмотрел. не нашел ибо даже не знаю что искать smile 

PM MAIL   Вверх
DeadMage
Дата 17.4.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Цитата(lazutov @  17.4.2008,  16:21 Найти цитируемый пост)
Такой вопрос: как сделать, чтобы при выделении текста(в браузере например)и при нажатии определенных клавиш(ctrl+что-то, например), то что выделено передавалось в программу.

Простейший, и при том самый действенный способ - эмулировать нажатие ctrl+c, и потом забирать из буфера обмена.
PM MAIL   Вверх
lazutov
Дата 17.4.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Поподробнее плс..
Как перехватить нажатие клавиши и нажать ctrl+c?

Это сообщение отредактировал(а) lazutov - 17.4.2008, 19:08
PM MAIL   Вверх
DeadMage
Дата 17.4.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Перехват нажатия клавиш - установкой хоткея. SetHotkey, кажись. Нажать ctrl+c - вот это уже более интерестно, нужно получить текущее окно (GetForegroundWindow вроде), потом последовательно посылать ему сообщений WM_KEYDOWN, WM_KEYUP. Точную реализацию не скажу, попробуй поискать, скорее всего уже было.
PM MAIL   Вверх
lazutov
Дата 19.4.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



теперь такой вопрос:

Код

function Key_HookKey(code: integer; wParam: integer; lParam: integer): integer stdcall;
begin
 {если code >= 0, то ловушка может обработать событие}
 if code >= 0 then
 begin
  // если Alt и 'Z'
  if (wParam = Ord('Z')) and (lParam and $20000000 <> 0) and (lParam and $40000000 = 0)
   then begin
    Result:=1;
    Sleep(1000);
    {
//первый вариант
PressKey(VK_CONTROL);
    ClickKey(Ord('C'));
    ReleaseKey(VK_CONTROL);
    Sleep(1000);
    }
//второй вариант
H:=GetForegroundWindow;
    SendMessage(H, WM_COPY, 0, 0);  // это отмеченная стока
    if Clipboard.HasFormat(CF_TEXT) then ShowMessage(Clipboard.AsText)
                                    else ShowMessage('В буфере обмена не текст!');
   end
  else Result:=0;
 end
 else
   //если code<0, вызывается следующая ловушка
   Result := CallNextHookEx(HKey, Code, wParam, lParam);
end;


итак при исполнении выделенной строки текст не копируется, вопрос почему? и что нужно сделать чтоб копировало.
Спасибо.
также не работает и первый вариант.

сама ловушка устанавливается и нажатие alt+Z отлавливает.
PM MAIL   Вверх
lazutov
Дата 20.4.2008, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Тогда конкретный вопрос: как програмно нажать ctrl+c

но с наверное так 
Код
SendMessage(Handle,WM_KEYDOWN,Byte('c'),0);

а как это сделать чтобы и ctrl был нажат? Можно ли сначала нажать(KeyDown) crtl потом нажать и отпустить С, затем отпустить ctrl? и как это реализовать?
Спасибо!.
PM MAIL   Вверх
Rrader
  Дата 20.4.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Цитата

как програмно нажать ctrl+c

http://forum.vingrad.ru/forum/topic-206684.html


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
lazutov
Дата 20.4.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Код

H:=GetForegroundWindow;
   // SendMessage(H, WM_COPY, 0, 0);
     keybd_event(VK_CONTROL, 0, 0, 0);
  keybd_event(ord('C'), 0, 0, 0);
  keybd_event(ord('C'), 0, KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    if Clipboard.HasFormat(CF_TEXT) then ShowMessage(Clipboard.AsText)     else ShowMessage('В буфере обмена не текст!');





Делаю так.
но текст не копируется, кто знает в чем проблема?
Заранее спасибо!
 PS аналогично не работает
Код

    SendMessage(H,WM_KEYDOWN,VK_CONTROL,0);
     SendMessage(H,WM_KEYDOWN,ord('c'),0);
    SendMessage(H,WM_KEYUP,ord('c'),0);
    SendMessage(H,WM_KEYUP,VK_CONTROL,0);


Это сообщение отредактировал(а) lazutov - 20.4.2008, 12:29
PM MAIL   Вверх
MetalFan
Дата 20.4.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



интересно, а как же лингво 12й работает... ведь почти отовсюду выделенный текст вытягивает на перевод


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
lazutov
Дата 20.4.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



именно Лингво мне этоу идею и подкинул.
PM MAIL   Вверх
MetalFan
Дата 20.4.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



напрашивается несколько вариантов возможной реализации (в лингво):
1. Распознавание текста под курсором (маловероятно). "+" определение текста даже из TLabel, "-" не определяет текст на картинке.
2. Явно видно, что внедряется хук (LvHook.dll - Lingvo Hook DLL)... вот только как все-таки определяется выводимый текст? возможно перехватываются функции вывода текста на экран... 
другие варианты в голову не приходят пока

Это сообщение отредактировал(а) MetalFan - 20.4.2008, 13:30


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
lazutov
Дата 20.4.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



SendMessage(H, WM_COPY, 0, 0); тоже не работает... 
PM MAIL   Вверх
MetalFan
Дата 20.4.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



lazutov, нет, там явно все хитрее сделано


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
lazutov
Дата 20.4.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



сейчас меня интересует как просто программно копировать текст в буфер обмена.
PM MAIL   Вверх
Rrader
  Дата 20.4.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



MetalFan, Lingvo ставит два хука, на WH_KEYBOARD и WH_MOUSE. Ну а дальше все просто, по нажатию нужных клавиш идет получение данных из буфера обмена и передача в Lingvo.

И даже неудивительно, перед тем как перехватить текст в буфере, сначала "жмутся" клавиши копирования - Ctrl+C или Shift+Ins. Из HookProc:

Код

; Проверка
...

push    11  ; Key = VK_CONTROL
call       ESI  ; GetKeyState

; Проверка
...

push    10  ; Key = VK_SHIFT
call       ESI  ; GetKeyState


Это сообщение отредактировал(а) Rrader - 20.4.2008, 16:22


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0709 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.