![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Vyadzmak |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 16.10.2008 Репутация: нет Всего: нет |
Помогите разобраться над вопросом. Суть его вот в чем:
В моей программе есть компонент memo. При копировании текста из сторонних программ, ctrl+с, ctrl+insert, или спомощью контекстного меню все получается замечательно. Текста заноситься в буфер, а оттуда прямиком в memo. Так вот, мне надо реализовать функцию, которая при выделении текста, вернее при его завершении, то есть при отпускании левой клавиши мыши, сама занесет выделенный текст в буфер обмена. У меня есть код: unit hk1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ClipBrd, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Memo1: TMemo; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private PrevHwnd: Hwnd; procedure wMMOUSEUP(var Msg: TWMLBUTTONUP); message WM_LBUTTONUP; procedure WMChangeCBChain(var Msg: TWMChangeCBChain); message WM_CHANGECBCHAIN; procedure WMDrawClipboard(var Msg: TWMDrawClipboard); message WM_DRAWCLIPBOARD; public { Public declarations } end; var Form1: TForm1; len:integer; H: THandle; implementation {$R *.dfm} procedure TForm1.wMMOUSEUP(var Msg: TWMLBUTTONUP); begin !!!!ВОТ ЧТО ЗДЕСЬ НАПИСАТЬ, ИЛИ ПОДСКАЖИТЕ ДРУГОЙ МЕТОД РЕАЛИЗАЦИИ end; procedure TForm1.WMChangeCBChain(var Msg: TWMChangeCBChain); begin if PrevHWnd = Msg.Remove then PrevHWnd := Msg.Next; if Msg.Remove <> Handle then SendMessage(PrevHWnd, WM_CHANGECBCHAIN, Msg.Remove, Msg.Next); end; procedure TForm1.WMDrawClipboard(var Msg: TWMDrawClipboard); var P: PChar; begin SendMessage(PrevHWnd, WM_DRAWCLIPBOARD, 0, 0); if Clipboard.HasFormat(CF_TEXT) then begin H := Clipboard.GetAsHandle(CF_TEXT); Len := GlobalSize(H) + 1; P := GlobalLock(H); Memo1.SetTextBuf(P); GlobalUnlock(H); end; Msg.Result := 0; end; procedure TForm1.FormCreate(Sender: TObject); begin PrevHwnd := SetClipboardViewer(Handle); end; end. Так вот помогите реализовать функцию, что бы моя программа в сторонних приложениях отлавливала отпускание левой клавиши мыши и выделенный текст заносила в буфер или сразу передавала в мою программу в компонент memo. Заранее спасибо |
|||
|
||||
| Vyadzmak |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 16.10.2008 Репутация: нет Всего: нет |
Ребят, помогите очень нужно. Проект горит!!!!!! Буду очень признателен
|
|||
|
||||
| Christoph |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Может быть так будет правильней...
и мне кажется что переменной PrevHwnd лучше быть глобальной и зачем описывать все сообщения? Сообщение WM_DRAWCLIPBOARD посылается первому окну в цепочке окон просмотра буфера обмена, когда изменяется содержание буфера обмена. Это дает возможность окну просмотра буфера обмена отобразить его новое содержание. а что бы его изменить надо скопировать...Мое мнение - этосообщение не подоходит :( Это сообщение отредактировал(а) Christoph - 18.10.2008, 15:36 -------------------- ![]() |
||||
|
|||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Вот например для небольшого эксперимента
Поидеи, как только скопировали...оно должно отобразиться с мемо :( Это сообщение отредактировал(а) Christoph - 18.10.2008, 16:42 -------------------- ![]() |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
Christoph, а при чем тут хэндл мемы? где обработка WM_DRAWCLIPBOARD и WM_CHANGECBCHAIN?
-------------------- There are always someone smarter than you... |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Функция SetClipboardViewer:
Данная функция добавляет определяемое окно к цепочке окон просмотра буфера обмена. а Окно просмотра буфера мемо а зачем изменять сообщения WM_DRAWCLIPBOARD и WM_CHANGECBCHAIN . 1 сообщение при изменение буфера выводит в окно его содержимое. а 2 сообщение удаляет из цепочки окно просмотра... Зачем его менять...не знаю -------------------- ![]() |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
Vyadzmak, я так понимаю, глобальный хук на мышу тебе поможет...
а вот если выделили текст с клавы? Добавлено через 30 секунд
ничего оно никуда не выводит -------------------- There are always someone smarter than you... |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Проблема эта и мне спать не дает...пробывал ее решить...
нашел компонент TWatch вроде как бы он, может описывать события для всех приложений...ну так вот...пробывал я сделать так:
Попробывал и через WM_KEYDOWN, WM_KEYUP ничего не получается -------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |