Захватить текст, выделенный мышью
Я пытаюсь создать программу, которая при нажатии горячей клавиши объединяет определенный текст с выбранным текстом из окна. например: у меня есть текст "захватить текст, выделенный мышью", я выбираю слово "текст" с помощью мыши, и теперь, когда я нажимаю определенную горячую клавишу, он копирует меня в буфер обмена: xxx+text+xxx. поэтому мой вопрос, как вернуть слово, выделенное мышью?
Спасибо!!
из того, что вы сказали мне, я поняла это:
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Clipbrd;
type
TForm4 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure WMHotkey(var Message: TWMHotKey); message WM_HOTKEY;
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
const
MY_ID = 123;
{$R *.dfm}
procedure TForm4.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle, MY_ID, MOD_CONTROL, ord('1'));
end;
procedure TForm4.FormDestroy(Sender: TObject);
begin
UnregisterHotKey(Handle, MY_ID);
end;
procedure TForm4.WMHotkey(var Message: TWMHotKey);
lookup_word: string;
begin
clipboard.clear;
if Message.HotKey = MY_ID then
begin
if not AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), true) then
RaiseLastOSError;
try
SendMessage( GetFocus, WM_GETTEXT, 0, 0 );
lookup_word:= clipboard.astext;
edit1.Text := lookup_word;
Clipboard.AsText := '<font color=blue> edit1.text </font>';
SendMessage(GetFocus, WM_PASTE, 0, 0);
finally
AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), false);
end;
end;
end;
end;
end.
это нормально?
мне удается создать свое приложение так, как я намеревался. но я столкнулся с другой проблемой сейчас. это не будет работать в приложении ASPX. он не будет распознавать текст из окна редактирования aspx. Есть ли способ обойти эту проблему?
Спасибо!
2 ответа
Если я правильно понимаю ваш вопрос, то, что вы имеете в виду под "текстом, выделенным мышью", является обычным выделенным текстом в элементе управления редактирования, таком как TEdit, TMemo или TRichEdit. Если это так, то VCL имеет свойство Seltext, которое содержит выбранный в данный момент текст. поэтому код будет выглядеть примерно так: (пример для управления TMemo)
...
uses Clipbrd;
...
Clipboard.asText:= xxx + Memo1.SelText + xxx;
...
Если выделенный текст взят из другого приложения, то он очень зависит от элемента управления, используемого приложением. Если элемент управления является стандартным элементом управления Windows или его потомком (в основном), то вы можете получить выделенный текст, отправив сообщение этому элементу управления, но если компонент не является стандартным, он не будет правильно отвечать на сообщение. Этот метод требует, чтобы вы знали дескриптор окна целевого элемента управления (используя GetFocus в модуле Windows): 1. Получить весь текст, отправив сообщение WM_GETTEXT 2. Получить позицию выбора, отправив сообщение EM_GETSEL 3. Вычислить выбранный текст (подстрока всего текста) с использованием позиции выбора из пункта 2. Если у вас есть исходный код vcl, вы можете использовать реализацию исходного кода класса TCustomEdit в модуле StdCtrls в качестве ссылки. мой пример:
...
var
Buff: array[0..65535] of char;
...
function CurrentSelectedText: string;
var
hFocus: hWnd;
aStart, aEnd: integer;
begin
//added by andrei, attach input to current thread
AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(GetForegroundWindow), true);
hFocus:= GetFocus;
SendMessage(hFocus, WM_GETTEXT, 65535, integer(@buff));
SendMessage(hFocus, EM_GETSEL, Integer(@aStart), Integer(@aEnd));
result:= Copy(StrPas(Buff), 1+aStart, aEnd-aStart);
end;
Пожалуйста, не злоупотребляйте этим буфером обмена. Буфер обмена предназначен для удобства пользователя, а не программиста. Если у пользователя есть что-то важное в буфере обмена, вы уничтожите его. И вы собираетесь вызывать неожиданные / нежелательные данные в приложениях расширения буфера обмена. Вы будете вызывать нежелательный сетевой трафик при использовании любых продуктов удаленного рабочего стола.