Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как скопировать из любого приложения выделенный текст в буфер? [D6, WinXP]


leonidus ©   (2006-06-17 19:11:00) 

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

keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,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,0);

и все прекрасно работает если "горячая клавиша" это Ctrl, но если "горячая клавиша" скажем Shift то код не срабатывает. И на самом деле если скажем руками нажать Shift и одновременно Ctrl+C то ничего в буфер обмена не скопируется, поэтому и код не работает. Но как же мне быть ведь условие "нажатия и не отпускания" горячей клавиши у меня обязательно?


leonidus   (2006-06-29 10:18:00) [1]

люди help!


leonidus   (2006-06-24 21:46:00) [2]

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


Leonid Troyanovsky   (2006-06-24 17:47:00) [3]


> leonidus ©   (24.06.06 13:09) [13]

> и еще не понятно, если по сути своей PostMessage и SendMessage
> выполняют одинаковые функции, то зачем их вызывать вместе?


При нажатии кнопок в очередь асинхронных сообщений попадают
(Post(Thread)Message) WM_KEYDOWN, WM_KEYUP.
Кроме того, при TranslateMessage некоторые WM_KEYDOWN генерируют
послание (PostMessage) WM_CHAR.

Ну, а такие сообщения как WM_COPY посылаются SendMessage,
т.е., синхронно.

В твоем случае, видимо, достаточно лишь последнего.

--
Regards, LVT.


leonidus   (2006-06-24 13:09:00) [4]

и еще не понятно, если по сути своей PostMessage и SendMessage выполняют одинаковые функции, то зачем их вызывать вместе?


leonidus   (2006-06-24 13:07:00) [5]

а с какими параметрами передается PostMessage и SendMessage?


HF-Trade   (2006-06-24 12:14:00) [6]

PostMessage
SendMessage


leonidus   (2006-06-24 11:55:00) [7]

У меня тут возникла мысль, а какое сообщение Windows посылает окну при обработке команды keybd_event? Может просто обойти эту самую keybd_event и напрямую послать нужное сообщение интересующему меня окну?


Германн   (2006-06-20 02:08:00) [8]

Имхо, в сабже явно проглядывает неверное понимание термина HotKey ("горячая клавиша")! :-(
И непонимание того, что в качестве "горячей клавиши" может выступать либо "функциональные клавиши" - F1..F12 (плюс с Shift-ом), либо какое-то сочетаниеиных клавиш, которое не имеет заранее заданного значения.


TStas   (2006-06-19 20:46:00) [9]

Вот проблему на ровном месте выдумали. Когда мне надо было транслит к аське написать, я именно ctrl+C Ctrl+Enter аське отсылал. Все работало замечательно. Иногда, правда, аське не все обрабатывала, так она в принципе скоростью не отличаеттся


Leonid Troyanovsky   (2006-06-19 18:49:00) [10]


> leonidus ©   (19.06.06 10:16) [6]

>  Юзер должен нажать и держать горяцую клавишу а программа
> скопировать текст в буфер.


Остается лишь SendMessage WM_COPY.
Т.е., оно должно сработать для обычных EDIT(вкл. редактор COMBOBOX), RichEdit и даже Word (хотя, для последнего, возможно, что через
SendMessageW, не помню).

Ну, а для нестандартных edit'ов (которые могут быть чем угодно)
все это может быть напрасным.

--
Regards, LVT.


leonidus   (2006-06-19 10:16:00) [11]

Нет так не получится, не спрашивайте почему, просто не получится. Юзер должен нажать и держать горяцую клавишу а программа скопировать текст в буфер.


Юрий Зотов   (2006-06-18 13:49:00) [12]

> leonidus ©   (18.06.06 13:44) [4]

А сразу нажать Ctrl+C, вместо какой-то другой горячей клавиши - разве юзер этого не может? Ему это даже и привычнее как-то.


leonidus   (2006-06-18 13:44:00) [13]

Ну это понятно, но если горячая клавиша у пользователя Shift то пока он ее держит то эмитация нажатия Ctrl+C через keybd_event не приводит к успеху, вот я и спрашиваю что делать. А про горячую клавишу - это именно так нужно, т.е. юзер выделил текст и держит горячую клавишу а программа берет и копирует тест в буфер. Как это реализовать?


Leonid Troyanovsky   (2006-06-18 12:01:00) [14]


> leonidus ©   (18.06.06 11:36) [2]

> Леонид, а что такое ^C ?


Ctrl+C

--
Regards, LVT.


leonidus   (2006-06-18 11:36:00) [15]

Леонид, а что такое ^C ?


Leonid Troyanovsky   (2006-06-18 10:48:00) [16]


> leonidus ©   (17.06.06 19:11)  

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

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

--
Regards, LVT.


Наверх

Титульная страница Поиск, карта сайта Написать письмо