使用附加运API文本备忘录(Append text to memo using Win API)

2019-09-16 09:28发布

我想追加文本行,此代码

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

// textLog一些线路如“程序开始为XXX”等

但它不追加,刚刚成立的新案文

Answer 1:

WM_SETTEXT将替换整个内容; 无论是读当前内容,追加新的文字和设置的地段或确保插入符号是在要追加到,并加入新的文本点EM_REPLACESEL



Answer 2:

建议您不要使用EM_SETSEL和EM_REPLACESEL。 因为较新的操作系统,如Vista和Windows 7中,UAC会阻止您发送这些消息。 我建议你。 1.获取窗口元件2的手柄做一个SETFOCUS,这将使你的光标在文本区域3.然后,你应该使用SendInput,这不会有任何UAC问题

希望能帮助到你。



Answer 3:

找到完整的解决方案

    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;


Answer 4:

或更好:

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


文章来源: Append text to memo using Win API