2011-07-06 26 views
12

Estoy jugando con la API Win32 y los mensajes de Windows tratando de descubrir cómo funcionan las cosas y encontré esto question very helpful.Escribir texto en el bloc de notas con C#/Win32

Me gustaría mejorar la solución proporcionada allí para que agregue el texto en lugar de simplemente reemplazar el texto en el bloc de notas a través de WM_SETTEXT.

Mi pregunta es, ¿cómo usaría WM_GETTEXTLENGHT, seguido de WM_GETTEXT, para obtener el texto actual en la ventana del bloc de notas para poder agregarle texto nuevo antes de usar WM_SETTEXT?

¿El uso de WM_XXXTEXT funciona en máquinas de 32 y de 64 bits? Si hay mucho texto en el bloc de notas, ¿funcionaría el algoritmo de obtención/ajuste propuesto o acapararía un montón de recursos? Si es así, ¿hay alguna otra manera de agregar texto a la ventana del bloc de notas sin copiar todo en él primero?

Gracias por su ayuda !!

ACTUALIZACIÓN:

Este es el código que se me ocurrió sobre la base de la ayuda de David Heffernan y Google pegar n/SO cortar. Como soy nuevo en el Win32API y copié muchas líneas de diferentes fuentes, apreciaría todos los comentarios.

[DllImport("User32.dll", CharSet = CharSet.Auto)] 
     extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, [In] string lpClassName, [In] string lpWindowName); 

     [DllImport("User32.dll", EntryPoint = "SendMessage")] 
     extern static int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

     [DllImport("User32.dll")] 
     public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 

     [DllImport("User32.dll")] 
     public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam); 

     const int WM_GETTEXTLENGTH = 0x000E; 

     const int EM_SETSEL = 0x00B1; 

     const int EM_REPLACESEL = 0x00C2; 

     public void testAppendText(string text) 
     { 
      Process[] notepads = Process.GetProcessesByName("notepad"); 
      if (notepads.Length == 0) return; 
      if (notepads[0] != null) 
      { 
       IntPtr editBox = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null); 
       int length = SendMessageGetTextLength(editBox, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero); 
       SendMessage(editBox, EM_SETSEL, length, length); 
       SendMessage(editBox, EM_REPLACESEL, 1, text); 
      } 

     } 

Respuesta

8

Enviar EM_SETSEL para poner el cursor hasta el final de la ventana de edición. A continuación, envíe EM_REPLACESEL para agregar texto.

Esto es mucho mejor que leer todo el contenido, agregar su adición y luego configurar todo el contenido si el control de edición contiene una gran cantidad de texto.

Estos métodos pueden cruzar los límites del proceso de 32/64 bits sin dificultad.

+0

¿EM_SETSEL y/o EM_REPLACESEL requieren el enfoque de la ventana? – Evan

+1

Parece que no requiere enfoque, actualizaré mi pregunta con el código que estoy usando según su solución. ¡Gracias por tu ayuda! – Evan

Cuestiones relacionadas