SendTextMessage如何打开记事本并显示指定内容

procedure TForm1.Button1Click(Sender: TObject);
var
  hEdit: HWND;
  str: string;
begin
  str := '准备要添加到记事本的字符串';
  WinExec('Notepad.exe', SW_SHOWNORMAL);
  hEdit := GetWindow(GetForegroundWindow, GW_CHILD);
  SendTextMessage(hEdit, WM_SETTEXT, 0, str);
end;

其中,SendTextMessage是Delphi 2009开始才有的函数,简单好用,说白了就是把消息的LPARAM参数当作字符串指针,传递到另一处,使用起来比较方便,其原型如下:

{$IFNDEF UNICODE}
function SendTextMessage(Handle: HWND; Msg: UINT; WParam: WPARAM; LParam: AnsiString): LRESULT;
begin
  Result := SendMessage(Handle, Msg, WParam, Windows.LPARAM(PAnsiChar(LParam)));
end;
{$ENDIF}

function SendTextMessage(Handle: HWND; Msg: UINT; WParam: WPARAM; LParam: UnicodeString): LRESULT;
begin
  Result := SendMessage(Handle, Msg, WParam, Windows.LPARAM(PWideChar(LParam)));
end;

function SendStructMessage(Handle: HWND; Msg: UINT; WParam: WPARAM; const LParam): LRESULT;
begin
  Result := SendMessage(Handle, Msg, WParam, Windows.LPARAM(@LParam));
end;

function SendGetStructMessage(Handle: HWND; Msg: UINT; WParam: WPARAM;
  var LParam; Unused: Boolean = False): LRESULT;
begin
  Result := SendMessage(Handle, Msg, WParam, Windows.LPARAM(@LParam));
end;

function SendGetIntMessage(Handle: HWND; Msg: UINT; var WParam: Integer;
  var LParam: Integer): LRESULT;
begin
  Result := SendMessage(Handle, Msg, Windows.WPARAM(@WParam), Windows.LPARAM(@LParam));
end;

需要注意的是,这种用法不仅仅是指发送WM_SETTEXT消息,而是可以是任何消息。一般由程序员手动写代码发送,而不是由Windows产生的消息,因为这里LPARAM的含义已经提前被占用了。

参考:http://www.cnblogs.com/del/archive/2009/11/12/1601703.html 

-----------------------------------------------------------------------------------

{用 API 实现的获取文本容器中选择的文本的函数}
function GetEditSeleteText(h: HWND): string;
var
  len,sx,ex: Integer; {文本总长度, 选择的开始位置, 选择的结束位置}
  buf: PChar;         {所有文本}
begin
  {获取文本总长度}
  len := SendMessage(h, WM_GETTEXTLENGTH, 0, 0) + 1;
  {为接受所有文本的缓冲区分配内存}
  buf := GlobalAllocPtr(0, len); {这里没有使用 GetMem, 因为需要全局的, 不然无法面对其他程序}
  {获取所有文本}
  SendMessage(h, WM_GETTEXT, len, Longint(buf));
  {获取选择的开始位置和结束位置}
  SendMessage(h, EM_GETSEL, Longint(@sx), Longint(@ex));
  {截取选择的文本}
  Result := Copy(buf, sx+1, ex-sx);
  {释放内存}
  GlobalFreePtr(buf);
end;

{测试 TEdit, 同时与 VCL 的获取方法对比}
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetEditSeleteText(Edit1.Handle) + ' - ' + Edit1.SelText);
end;

{测试 TMemo, 同时与 VCL 的获取方法对比}
procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(GetEditSeleteText(Memo1.Handle) + ' - ' + Memo1.SelText);
end;

{测试 TRichEdit, 同时与 VCL 的获取方法对比}
procedure TForm1.Button3Click(Sender: TObject);
begin
  ShowMessage(GetEditSeleteText(RichEdit1.Handle) + ' - ' + RichEdit1.SelText);
end;

参考:http://www.cnblogs.com/del/archive/2008/06/19/1225080.html

原文地址:https://www.cnblogs.com/findumars/p/4122333.html