• 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

  • 相关阅读:
    关于Qt国产化系统开发的几点总结
    C#和Qt实现的对于异常处理的一个使用策略
    echarts 自定义省份区块颜色的两种方法
    获取某个文件下的.vue文件
    仿写单选框/多选框
    重置对象属性
    elementUI之树形数据Table遇到的问题
    sass使用记录
    koa的使用记录
    六顶思想帽
  • 原文地址:https://www.cnblogs.com/findumars/p/4122333.html
Copyright © 2020-2023  润新知