захватить текст, выделенный мышью - PullRequest
2 голосов
/ 08 ноября 2010

Я пытаюсь создать программу, которая при нажатии горячей клавиши объединяет определенный текст с выбранным текстом из окна. Например: у меня есть текст «захватить текст , выделенный мышью», я выбираю слово «текст» с помощью мыши, и теперь, когда я нажимаю определенную горячую клавишу, он копирует меня в буфер обмена: 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 ]

1 голос
/ 08 ноября 2010

Если я правильно понимаю ваш вопрос, то, что вы подразумеваете под «текстом, выделенным мышью», является обычным выделенным текстом в элементе управления редактирования, таком как 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;
0 голосов
/ 08 ноября 2010

Пожалуйста, не злоупотребляйте этим буфером обмена. Буфер обмена предназначен для удобства пользователя, а не программиста. Если у пользователя есть что-то важное в буфере обмена, вы собираетесь стереть это. И вы будете вызывать неожиданные / нежелательные данные в приложениях расширения буфера обмена. Вы будете вызывать нежелательный сетевой трафик при использовании любых продуктов удаленного рабочего стола.

...