Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.23;
Скачать: CL | DM;

Вниз

Получение выделенного фрагмента текста   Найти похожие ветки 

 
Olgerd ©   (2002-07-28 01:27) [0]

Люди, долго я долбался, но написал в итоге код, показывающий выделенный кусок текста в активном окне.
Вот он:

// Надо кинуть таймер на форму с интервалом где-то 500 и Memo.
// Название процедур говорит само за себя.

procedure TForm1.Timer1Timer(Sender: TObject);

function GetFocusedChild( Wnd: HWnd ): HWnd;
var Tr1, Tr2: THandle;
begin
Result := 0;
Tr1 := GetCurrentThreadId;
Tr2 := GetWindowThreadProcessId( Wnd, nil );
if Tr1 = Tr2 then
Result := GetFocus
else
if AttachThreadInput( Tr2, Tr1, True ) then
begin
Result := GetFocus;
AttachThreadInput( Tr2, Tr1, False );
end;
end;

function GetSelStart(h:HWND): Integer;
begin
SendMessage(h, EM_GETSEL, Longint(@Result), 0);
end;

function GetSelLength(h:HWND): integer;
var Selection: TSelection;
begin
SendMessage(h, EM_GETSEL, Longint(@Selection.StartPos), Longint(@Selection.EndPos));
Result := Selection.EndPos - Selection.StartPos;
end;

function GetSelText(h: HWND): string;
var
TxtLength : integer;
buffer: string;
begin
TxtLength := SendMessage(h, WM_GETTEXTLENGTH, 0, 0)+1;
SetLength (buffer, TxtLength);
Sendmessage (h,WM_GETTEXT, TxtLength, longint(@buffer[1]));
result :=Trim(Copy(buffer,GetSelStart(h)+1,GetSelLength(h)));
end;

var FocusedHandle: HWND;
begin
if GetFocusedChild(GetForegroundWindow)<>0
then FocusedHandle:=GetFocusedChild(GetForegroundWindow); // Это чтобы текст оставался в Memo.
if FocusedHandle<>Memo1.Handle then Memo1.Text:=GetSelText(FocusedHandle);
end;
end;


Но есть небольшая проблема, он показывает выделенный кусок текста не везде, например, в Notepad"е показывает, а Word"е нет. Вопрос, как сделать, чтобы он вытаскивал код отовсюду, как Punto Switcher?


 
Olgerd ©   (2002-07-31 17:28) [1]

Что никому не интересно?


 
Виктор Щербаков ©   (2002-07-31 17:38) [2]

Нужно понимать, что механизм, которым ты пользуешься подходит только для стандартных элементов управления. Тех которые поддерживают EM_GETSEL, WM_GETTEXT.
Если я, к примеру, напишу с нуля компонент, который эти сообщения не будет поддерживать, то, такой метод не сработает.
Именно по-этому с Word"ом не получилось и может не получится со многими другими текстовыми редакторами.

Другими словами: в общем виде эта задача не решается.


 
Olgerd ©   (2002-08-01 18:53) [3]

Так как же тогда её решает Punto Switcher?


 
Виктор Щербаков ©   (2002-08-02 12:11) [4]

Olgerd © (01.08.02 18:53)
Честно говоря, не знаю как решает, и не знаю, что это такое вообще :(((

Может быть (в порядке предположения) просто встроена поддержка нескольких популярных текстовых процессоров. Но это не есть "вытаскивание отовсюду".

Я же говорю, если мне взбредет в голову написать текстовый редактор не на основе стандартного эл-та управления, то никакой Punto Switcher выделенный текст оттуда не вытащит.


 
ggrisha ©   (2002-08-02 16:36) [5]

Можно эмулировать нажатия Ctrl-C. Хотя тоже будет работать не во всех программах. Но с большим количеством программ пойдет.


 
Виктор Щербаков ©   (2002-08-02 16:43) [6]

ggrisha © (02.08.02 16:36)
Пойдет, но как-то это не красиво по отношению к пользователю. Вдруг у него в ClipBoard"е что-то очень важное.


 
ggrisha ©   (2002-08-02 17:12) [7]

Так можно при этом старый ClipBoard куда нибудь сохранять и после копирования восстанавливать.


 
Olgerd ©   (2002-08-02 18:32) [8]


> Виктор Щербаков © (02.08.02 12:11)
> Olgerd © (01.08.02 18:53)
> Честно говоря, не знаю как решает, и не знаю, что это такое
> вообще :(((

Программа для автоматической смены раскладки клавиатуры http://punto.ru/switcher/


> ggrisha © (02.08.02 17:12)

А если в буфере не фрагмент текста, а здоровенный рисунок? Как тогда поступать?



Страницы: 1 вся ветка

Текущий архив: 2002.09.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
4-73945
Dmk
2002-08-07 00:09
2002.09.23
Как избавиться от сообщения?


4-73949
ValeX
2002-08-02 18:13
2002.09.23
ReadFile...


1-73630
Alex_R
2002-09-12 14:04
2002.09.23
Где бы найти функцию для преобразовании строки в дату-время?


1-73670
Viktor Kushnir
2002-09-08 13:08
2002.09.23
Drag блин and Drop


1-73654
Rambustron
2002-09-11 16:48
2002.09.23
Не закрывается...