0

このコードでテキスト行を追加しようとしています

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

// textLogはいくつかの行です(例:'プログラムはxxxで開始されました'など)

ただし、追加せず、新しいテキストを設定するだけです

4

4 に答える 4

4

WM_SETTEXTコンテンツ全体を置き換えます。現在のコンテンツを読み、新しいテキストを追加してロットを設定するか、キャレットが追加したいポイントにあることを確認して、新しいテキストを追加しますEM_REPLACESEL

于 2012-04-07T12:07:29.330 に答える
1

EM_SETSELまたはEM_REPLACESELを使用しないことをお勧めします。VistaやWindows7などの新しいオペレーティングシステムでは、UACにより、これらのメッセージを送信できなくなります。私はあなたに提案します。1.ウィンドウ要素のハンドルを取得します2.setfocusを実行します。これにより、カーソルがテキストエリアに配置されます。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 に答える