使用Win API将文本附加到备忘录

时间:2012-04-07 07:55:03

标签: api winapi sendmessage memo

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

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

// textLog是一些行,例如'程序从xxx开始'等等

但它没有附加,只需设置新文本

4 个答案:

答案 0 :(得分:4)

WM_SETTEXT将取代整个内容;要么读取当前内容,请附加新文本&设置批次或确保插入符号位于您要附加的位置,并使用EM_REPLACESEL添加新文本。

答案 1 :(得分:1)

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

希望它有所帮助。

答案 2 :(得分: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;

答案 3 :(得分: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