捕获用鼠标选择的文本

时间:2010-11-08 09:19:19

标签: delphi text clipboard return selected

我正在尝试创建一个程序,当我按下热键时,它会将某个文本连接到窗口中的选定文本。例如:我有“使用鼠标选择文本”文本,我用鼠标选择单词“text”,现在当我按下某个热键时,它会将我复制到剪贴板中: XXX +文字+ 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 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您对“使用鼠标选择的文本”的含义是编辑控件上的正常突出显示文本,例如TEdit,TMemo或TRichEdit。 如果是这种情况,则VCL具有包含当前所选文本的Seltext属性。 因此代码将类似于:( TMemo控件的示例)

...
uses Clipbrd;
...
Clipboard.asText:= xxx + Memo1.SelText + xxx;
...

如果所选文本来自其他应用程序,则它非常依赖于应用程序使用的控件。如果控件是标准的Windows控件或它的后代(主要是),那么您可以通过向该控件发送消息来获取所选文本,但如果该组件不是标准组件,则它将不会正确响应该消息。此方法要求您知道目标控件的窗口句柄(在Windows单元中使用GetFocus):  1.通过发送WM_GETTEXT消息获取整个文本  2.通过发送EM_GETSEL消息获取选择位置  3.使用选择计算所选文本(整个文本的子字符串)     从第2点开始的位置。 如果你有一个vcl源,你可以在StdCtrls单元中使用TCustomEdit类源代码实现作为参考。 我的例子:

...
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;

答案 1 :(得分:0)

请不要以这种方式滥用剪贴板。提供剪贴板是为了方便用户,而不是程序员。如果用户在剪贴板上有重要的内容,您将要将其删除。而且您将导致意外/不需要的数据出现在剪贴板扩展程序应用程序中。使用任何类型的远程桌面产品时,您将导致不必要的网络流量。