2011-10-12 17 views
13

Quiero conseguir el contenido del control/mango de una aplicación ..C# cómo utilizar WM_GETTEXT/GetWindowText API

Aquí está el código experimental ..

Process[] processes = Process.GetProcessesByName("Notepad"); 
     foreach (Process p in processes) 
     { 
      StringBuilder sb = new StringBuilder(); 
      IntPtr pFoundWindow = p.MainWindowHandle; 
      List <IntPtr> s = GetChildWindows(pFoundWindow); 
      // function that returns a 
      //list of handle from child component on a given application. 

      foreach (IntPtr test in s) 
      { 
       // Now I want something here that will return/show 
       the text on the notepad.. 


      } 


      GetWindowText(pFoundWindow, sb,256); 
      MessageBox.Show(sb.ToString()); // this shows the title.. no problem with that 

     } 

alguna idea? He leído algún método API como GetWindowText o WM_GETTEXT pero no sé cómo usarlo o aplicarlo en mi código .. Necesito un tutorial o código de muestra ...

Gracias de antemano:)

Respuesta

15
public class Class1 
     { 
     [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
     public static extern int RegisterWindowMessage(string lpString); 

     [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = System.Runtime.InteropServices.CharSet.Auto)] // 
     public static extern bool SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam); 
      [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
     public static extern IntPtr SendMessage(int hWnd, int Msg, int wparam, 
     int lparam); 

     const int WM_GETTEXT = 0x000D; 
     const int WM_GETTEXTLENGTH = 0x000E; 

     public void RegisterControlforMessages() 
     { 
      RegisterWindowMessage("WM_GETTEXT"); 
     } 
     public string GetControlText(IntPtr hWnd) 
     { 

      StringBuilder title = new StringBuilder(); 

      // Get the size of the string required to hold the window title. 
      Int32 size = SendMessage((int)hWnd, WM_GETTEXTLENGTH, 0, 0).ToInt32(); 

      // If the return is 0, there is no title. 
      if (size > 0) 
      { 
     title = new StringBuilder(size + 1); 

     SendMessage(hWnd,(int)WM_GETTEXT, title.Capacity, title); 


      } 
      return title.ToString(); 
     } 
    } 

formato de código lamentable tomó mucho tiempo, todavía se está acostumbrando a ello.

+0

Woah, que funciona en la libreta. .pero no funciona en otra aplicación, pero supongo que el problema es que necesito el control del componente hijo ... quizás necesite investigar más;) – user848682

+1

sí, si el control que buscas es un control infantil en un ventana dada, entonces necesita obtener iterativamente los controles y detener cuando el título coincida con el requerido. –

+0

uhmm, samra si tienes tiempo libre, ¿puedes darme un método que acepte un identificador y devuelva la lista de control infantil? gracias por adelantado. Hay algo mal con el método que obtuve de la red ... – user848682

3

GetWindowText no le dará el contenido de las ventanas de edición de otras aplicaciones - it only supports default-managed text [como las leyendas de las etiquetas] en todos los procesos para evitar cuelgues ... tendrá que enviar WM_GETTEXT.

Usted tendrá que utilizar una versión de StringBuilder SendMessage:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [Out] StringBuilder lParam); 

const int WM_GETTEXT = 0xD; 
StringBuilder sb = new StringBuilder(65535); 
// needs to be big enough for the whole text 
SendMessage(hWnd_of_Notepad_Editor, WM_GETTEXT, sb.Length, sb);