Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.008 c
3-73570
vadik212
2002-09-03 21:27
2002.09.23
IBEvent


3-73563
Wild
2002-09-03 16:34
2002.09.23
Объектно ориентированные БД.


14-73853
michael_b
2002-08-27 21:43
2002.09.23
Посоветуйте программу для взлома файлов защищенных средствами MS


3-73494
RDA
2002-08-30 11:52
2002.09.23
Динамический SQL


3-73480
Morgan3212
2002-08-27 16:13
2002.09.23
БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский