一个用delphi开发的程序有一个TRichView类的窗体(用spy++看的)
其显示的文本可能是只读的.现在希望用 C# 的Process启动一个进程 调用 该程序并去的该 TRichView类的窗体 中的文本.我用FindWindow ,FindWindowEx 已经找到该 窗体的 句柄.用SendMessage 发送 WM_GETTEXT 取得不到文本
                   EM_SETSEL 全选文本也选不到(想wm_copy)
发送按键{ctrl-A}等都不能取到其中的文本.(反正就是不能全选)
除了这些,哪位还知道其他的什么方法可以取 另外一个进程中 TRichXXX控件中的文本.
谁有高招?!

解决方案 »

  1.   

    继续使用FindWindow 查找控件的句柄,然后打它Text的主意
      

  2.   

    是在打Text的注意呀,就是想得到它,
    句柄找出来了,可是就是取不到其Text.
    手动操作Ctrl+A可以全选,,,用SendMessage却不行.
    取同一个程序的其他控件(TextBox)的就没有任何问题..
    来了就是就绝招的了!
      

  3.   

    使用Windows API :   GetDlgItemText
      

  4.   

    用SPY++的突出显示, 可以看到要取的文本就在 闪动的 框框中可是就是取不到,
      

  5.   

    ....
    手动操作Ctrl+A可以全选,,,用SendMessage却不行.
    ....
    PostMessage如何?
      

  6.   

    PostMessage 这个和  SendMessage 在这个地方影响不大吧?!
    不过等会试试!
      

  7.   

    我个人感觉PostMessage相对安全一些,BTW ,系统必需至少在2K/XP/03吧...
      

  8.   

    多谢  timiil(小华) 老兄了..
    我试过  PostMessage 了 还是不行..
      

  9.   

    我把我的代码贴给大家看看
    private void button1_Click(object sender, System.EventArgs e)
    {
       StringBuilder strB = new StringBuilder(100);
       SendMessage(hWnd,WM_GETTEXT,100,strB);
       string a = strB.ToString().Trim();
       MessageBox.Show(a);
    }
    就是取不到该 TRichEdit 中的文本.
    可是用SPY++ 监控该控件的信息 ,每按一次按钮 就有两条WM_GETTEXT 短信如下:<00001> xxxxxxx S WM_GETTEXT cchTextMax:100 lpszText:xxxxxx
    <00002> xxxxxxx R WM_GETTEXT cchCopyied:0 lpszText: xxxxxxx ("所需要的字符串出现在这里")说明已经把字符从控件中取出,只是没有返回到C#程序中,看哪位老兄再出手相助!
      

  10.   

    [DllImport("user32.dll",EntryPoint="SendMessage")]
    public static extern int SendMessage(IntPtr hWnd,int wMsg,IntPtr  wParam,StringBuilder  lParam);
    const int WM_GETTEXT=0x000D;
    private void button1_Click(object sender, System.EventArgs e)
    {
    StringBuilder strB = new StringBuilder(100);
    SendMessage(this.richTextBox1.Handle,WM_GETTEXT,new  IntPtr(255),strB);
    string a = strB.ToString().Trim();
    MessageBox.Show(a);
    }
      

  11.   

    Delphi:type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Edit1: TEdit;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;Memo1内容:
    Memo1
    assdafasfasdf我尝试了,是可以拿到的. private void button1_Click(object sender, System.EventArgs e)
    {
    StringBuilder strB = new StringBuilder(100);
    SendMessage((System.IntPtr)0x00020F54,WM_GETTEXT,new IntPtr(255), strB);
    string a = strB.ToString().Trim();
    MessageBox.Show(a);
    }显示:
    Memo1
    assdafasfasdf