Главная страница
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.012 c
7-73911
ValeX
2002-07-11 18:39
2002.09.23
вопрос по RS232


1-73754
ASDFG
2002-09-11 15:32
2002.09.23
XML ???


1-73614
Andrey_Pavlov
2002-09-12 12:35
2002.09.23
Как создать класс по имени


1-73698
roman002
2002-09-11 07:49
2002.09.23
Сервис+WinExec


1-73602
Демонов Е.В.
2002-09-10 16:20
2002.09.23
А что если метод в секцию Published ?