我正在编写此代码以从另一个应用程序(进程)中选择一些文本行 但问题是我无法熟悉这个应用程序并获得所选文本 文本选择完美但无法复制此文本,有没有办法模拟Ctrl + C. 在delphi中命令?这是我的代码
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;
答案 0 :(得分:4)
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);
答案 1 :(得分:1)
尝试向目标窗口(编辑控件)句柄发送WM_COPY消息。
答案 2 :(得分:1)
工作正常。您已在your other related question中表示您正在使用记事本 - 这将从正在运行的记事本实例(它找到的第一个!)中检索所有文本并将其放入TMemo
德尔福表格。在Windown 7 64位上在Delphi 2007中测试。
procedure TForm1.Button3Click(Sender: TObject);
var
NpWnd, NpEdit: HWnd;
Buffer: String;
BufLen: Integer;
begin
Memo1.Clear;
NpWnd := FindWindow('Notepad', nil);
if NpWnd <> 0 then
begin
NpEdit := FindWindowEx(NpWnd, 0, 'Edit', nil);
if NpEdit <> 0 then
begin
BufLen := SendMessage(NpEdit, WM_GETTEXTLENGTH, 0, 0);
SetLength(Buffer, BufLen + 1);
SendMessage(NpEdit, WM_GETTEXT, BufLen, LParam(PChar(Buffer)));
Memo1.Lines.Text := Buffer;
end;
end;
end;