none
C#中如何使用Win32 API中的EM_GETLINE获取一个Edit控件中的内容 RRS feed

  • 问题


  • 请问在C#中如何使用Win32 API中的EM_GETLINE获取一个Edit控件中的内容。

    以下是我的代码

    1、定义一个缓冲区
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct STRINGBUFFER
    {
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
      public string szText;
    }
    2、将编辑控件某一行的内容拷贝到缓冲区中
    int EM_GETLINE = 0x00C4;
    STRINGBUFFER contentEditBoxLine;                                                 // 存放编辑控件中行的内容
    SendMessage(hWnd, EM_GETLINE, (IntPtr)0, out contentEditBoxLine); // hWnd获取到的编辑控件的句柄,这条语句将编辑控件中的第一行内容拷贝到contentEditBoxLine中
    问题是:我得到的contentEditBoxLine的内容永远是空的

    MSDN上对EM_GETLINE的参数lParam是这样解释的:Long pointer to the buffer that receives a copy of the line. The first word of the buffer specifies the maximum number of characters that can be copied to the buffer. 我想请问的是我要如何设置缓冲区contentEditBoxLine的first word


    Spark
    2011年6月2日 1:50

答案

  • 你好

    GetWindowText指定窗口的标题条文本(如果存在)拷贝到一个缓存区内。如果指定的窗口是一个控件,则拷贝控件的文本。但是,GetWindowText不能接收在其他应用程序中的控件的文本。

    因为你指定的记事本是一个窗体,所以只能获取到标题的文本。

    所以建议你还是用EM_GETLINE。我用下面的代码可以读取文本里面的文字。

    [DllImport("user32.dll", EntryPoint = "SendMessageA")]
    
      private static extern int SendMessage_Ex(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
    
      private const int EM_GETLINE = 0xc4;
    
    public void test(){
    
       IntPtr hWnd = new IntPtr(0x000C0DD6);//获取到的edit控件的句柄
    
       StringBuilder contentEditBoxLine = new StringBuilder(); //用StringBuilder 
    
       SendMessage_Ex(hWnd, EM_GETLINE, 0, contentEditBoxLine); 
    
    }
    
    

    然后可以读取到文本里面的第一行的数据。

    希望对你有帮助。


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    • 已标记为答案 Cookie Luo 2011年6月9日 7:52
    2011年6月6日 6:44

全部回复

  • 把最后一个参数换成 StringBuilder 试试看吧。另外,如果您知道了 Edit 的句柄,直接用 GetWindowText 获取其文本来的更容易。
    Mark Zhou
    2011年6月2日 7:03
  • 感谢您的解答,我按照您的方法先获取了一个记事本的句柄,然后再使用GetWindowText 直接获取记事本(记事本的编辑区域就是一个Edit控件,使用Spy++得知的)的文本内容,但获取结果始终为空。GetWindowText 是不是不能获取记事本的内容呢? 这是第一个问题

    另外一个问题:我使用EM_GETLINE是因为我想一行一行的获取Edit控件中的内容。而GetWindowText 是一次性读取控件中的所有内容(如果能够读取的话)


    Spark
    2011年6月2日 10:25
  • 你好

    GetWindowText指定窗口的标题条文本(如果存在)拷贝到一个缓存区内。如果指定的窗口是一个控件,则拷贝控件的文本。但是,GetWindowText不能接收在其他应用程序中的控件的文本。

    因为你指定的记事本是一个窗体,所以只能获取到标题的文本。

    所以建议你还是用EM_GETLINE。我用下面的代码可以读取文本里面的文字。

    [DllImport("user32.dll", EntryPoint = "SendMessageA")]
    
      private static extern int SendMessage_Ex(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
    
      private const int EM_GETLINE = 0xc4;
    
    public void test(){
    
       IntPtr hWnd = new IntPtr(0x000C0DD6);//获取到的edit控件的句柄
    
       StringBuilder contentEditBoxLine = new StringBuilder(); //用StringBuilder 
    
       SendMessage_Ex(hWnd, EM_GETLINE, 0, contentEditBoxLine); 
    
    }
    
    

    然后可以读取到文本里面的第一行的数据。

    希望对你有帮助。


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    • 已标记为答案 Cookie Luo 2011年6月9日 7:52
    2011年6月6日 6:44