我正在尝试创建一个程序,当我按下热键时,它会将某个文本连接到窗口中的选定文本。例如:我有“使用鼠标选择文本”文本,我用鼠标选择单词“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编辑框的文本。有没有解决这个问题的方法?
谢谢!
答案 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)
请不要以这种方式滥用剪贴板。提供剪贴板是为了方便用户,而不是程序员。如果用户在剪贴板上有重要的内容,您将要将其删除。而且您将导致意外/不需要的数据出现在剪贴板扩展程序应用程序中。使用任何类型的远程桌面产品时,您将导致不必要的网络流量。