2

ホットキーを押すと、特定のテキストをウィンドウから選択したテキストに連結するプログラムを作成しようとしています。例:「マウスで選択したテキストをキャプチャする」というテキストがあり、マウスで「テキスト」という単語を選択すると、特定のホットキーを押すと、次のようにクリップボードにコピーされます: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 編集ボックスからのテキストを認識しません。この問題を回避する方法はありますか?

ありがとう!

4

2 に答える 2

1

私があなたの質問を正しく理解していれば、「マウスで選択したテキスト」とは、TEdit、TMemo、TRichEdit などの編集コントロールで強調表示された通常のテキストです。そのような場合、VCL には現在選択されているテキストを含む Seltext プロパティがあります。コードは次のようになります: (TMemo コントロールの例)

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

選択したテキストが他のアプリケーションからのものである場合、そのアプリケーションが使用するコントロールに大きく依存します。コントロールが標準の Windows コントロールまたはその子孫 (ほとんどの場合) である場合、そのコントロールにメッセージを送信して選択したテキストを取得できますが、コンポーネントが標準のコントロールでない場合、メッセージに正しく応答しません。このメソッドでは、ターゲット コントロールのウィンドウ ハンドルを知る必要があります (Windows ユニットで GetFocus を使用)。 1. WM_GETTEXT メッセージを送信してテキスト全体を取得します。 2. EM_GETSEL メッセージを送信して選択位置を取得します。テキスト全体の部分文字列) ポイント 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;
于 2010-11-08T10:21:02.957 に答える
0

このようにクリップボードを悪用しないでください。クリップボードは、プログラマーではなく、ユーザーの利便性のために提供されています。ユーザーがクリップボードに何か重要なものを持っている場合は、それを消去します。また、予期しない/不要なデータがクリップボード エクステンダー アプリに表示されるようになります。あらゆる種類のリモート デスクトップ製品を使用すると、不要なネットワーク トラフィックが発生します。

于 2010-11-08T13:47:36.830 に答える