-2

別のアプリケーション (プロセス) からいくつかのテキスト行を選択するためにこのコードを書いていますが、問題は、このアプリケーションを処理して、選択したテキストを完全に選択したテキストを取得することはできませんが、このテキストをコピーできないことです。 delphi で Ctrl+C コマンドをシミュレートする方法はありますか? これは私のコードです

    SetCursorPos(300, 300);
  mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  SetCursorPos(300, 350);
  mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  if not AttachThreadInput(GetCurrentThreadId,
    GetWindowThreadProcessId(GetForegroundWindow), true) then
    RaiseLastOSError;
  try

    SendMessage(GetFocus, WM_GETTEXT, 0, 0);
    lookup_word := clipboard.astext;
    CurvyEdit1.Text := lookup_word;
  finally
    AttachThreadInput(GetCurrentThreadId,
      GetWindowThreadProcessId(GetForegroundWindow), false);
  end;
4

3 に答える 3

5

WM_GETTEXT実際のテキストを直接取得し、テキストをクリップボードに置きません。 WM_COPY代わりにそれを行います。を使用する場合WM_GETTEXTは、テキストをコピーするための文字バッファーを提供する必要があります。あなたはそうしていません。

したがって、WM_GETTEXT正しく使用してください:

var
  lookup_word: string;
  Wnd: HWND;
  Len: Integer;

lookup_word := '';

Wnd := GetFocus;
if Wnd <> 0 then
begin
  Len := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
  if Len > 0 then
  begin
    SetLength(lookup_word, Len);
    Len := SendMessage(Wnd, WM_GETTEXT, Len+1, LPARAM(PChar(lookup_word)));
    SetLength(lookup_word, Len);
  end;
end;
CurvyEdit1.Text := lookup_word;

または、代わりに WM_COPY を使用します。

SendMessage(GetFocus, WM_COPY, 0, 0);
于 2013-07-11T22:48:04.213 に答える
1

WM_COPYメッセージをターゲット ウィンドウ (編集コントロール) ハンドルに送信してみてください。

于 2013-07-11T22:36:04.117 に答える