0

我正在尝试使用此代码附加文本行

SendMessage(Form1.log.Handle, WM_SETTEXT, 0, Integer(PChar(textLog)));

// textLog 是一些行,例如 'Program started at xxx' 等

但它不附加,只是设置新文本

4

4 回答 4

4

WM_SETTEXT将替换整个内容;要么阅读当前内容,追加新文本并设置批号,要么确保插入符号位于您希望追加的位置,然后使用EM_REPLACESEL.

于 2012-04-07T12:07:29.330 回答
1

建议您不要使用 EM_SETSEL 或 EM_REPLACESEL。因为在 vista 和 windows 7 等较新的操作系统上,UAC 会阻止您发送这些消息。我建议你这样做。1. 获取窗口元素的句柄 2. 做一个setfocus,这会将你的光标定位在textarea 3. 然后你应该使用SendInput,这对UAC没有任何问题

希望能帮助到你。

于 2012-04-26T01:32:21.907 回答
0

找到完整的解决方案

    procedure appendLog(const S: string);
var
  SelStart, LineLen: Integer;
  Line: string;
begin

  SelStart := SendMessage(Form1.log.Handle, EM_LINEINDEX, 0, 0);
  if SelStart >= 0 then Line := S + #13#10 else
    begin
      SelStart := SendMessage(Form1.log.Handle, EM_LINEINDEX, -1, 0);
      if SelStart < 0 then Exit;
      LineLen := SendMessage(Form1.log.Handle, EM_LINELENGTH, SelStart, 0);
      if LineLen = 0 then Exit;
      Inc(SelStart, LineLen);
      Line := #13#10 + s;
    end;

  SendMessage(Form1.log.Handle, EM_SETSEL, SelStart, SelStart);
  SendMessage(Form1.log.Handle, EM_REPLACESEL, 0, Longint(PChar(Line)));

end;
于 2012-04-07T17:21:28.653 回答
0

或更好:

SendMessage(Form1.log.Handle, EM_SETSEL, 0, -1);
SendMessage(Form1.log.Handle, EM_SETSEL, (WPARAM)-1, -1);
SendMessage(Form1.log.Handle, EM_REPLACESEL, 0, (LPARAM)Msg); //add a text
//SendMessage(Form1.log.Handle, EM_REPLACESEL, 0, (LPARAM)L"\r\n"); //add a new line
于 2017-12-24T20:16:30.040 回答