Форум: "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