Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: CH4ØZ en 5 Agosto 2010, 20:54 pm



Título: Enviar mensaje a la consola
Publicado por: CH4ØZ en 5 Agosto 2010, 20:54 pm
bueno tengo un problema usando FindWindow, ya que al parecer estoy cometiendo algun error que se me pasa por alto.

despues de leer un poco y escribir varias veces el codigo no logro enviar un mensaje a la consola (DOS windows), desde mi programa.

alguien me puede dar una mano por favor?


Título: Re: Enviar mensaje a la consola
Publicado por: [D4N93R] en 6 Agosto 2010, 00:08 am
Puedes replantear tu pregunta por favor? No entiendo qué tiene que ver FindWindow con la consola? O también postea esa parte del código a ver si vemos el error.

Un saludo!


Título: Re: Enviar mensaje a la consola
Publicado por: CH4ØZ en 6 Agosto 2010, 00:52 am
estuve leyendo sobre como enviar un texto a una aplicacion externa a la mia, y encontre que se hace con FindWindow, FindWindowEx y SendMessage o PostMessage.

Tube la idea de enviar un mensaje a la consola de comandos de windows para ver si podia, pero al intentarlo no logre nada.

aca algunos de los codigos con los que intente (ya que no recuerdo todos):

Código
  1.        Dim hWnd As Long, tmp As Long
  2.        'forma 1:
  3.        For Each P As Process In Process.GetProcesses
  4.            If P.ProcessName = "Símbolo del sistema" Then
  5.                hWnd = P.MainWindowHandle
  6.            End If
  7.        Next
  8.        SendMessage(hWnd, WM_SETTEXT, 0, "texto")
  9.        'forma 2:
  10.        For Each P As Process In Process.GetProcesses
  11.            If P.ProcessName = "Símbolo del sistema" Then
  12.                tmp = P.MainWindowHandle
  13.            End If
  14.        Next
  15.        hWnd = GetWindow(tmp, 5)
  16.        SendMessage(hWnd, WM_SETTEXT, 0, "texto")
  17.        'forma 3:
  18.        hWnd = FindWindow(vbNullString, "Símbolo del sistema")
  19.        SendMessage(hWnd, WM_SETTEXT, 0, "texto")
  20.        'forma 4:
  21.        tmp = FindWindow(vbNullString, "Símbolo del sistema")
  22.        hWnd = GetWindow(tmp, 5)
  23.        SendMessage(hWnd, WM_SETTEXT, 0, "texto")
  24.  


Título: Re: Enviar mensaje a la consola
Publicado por: CH4ØZ en 7 Agosto 2010, 00:34 am
nadie sabe como puedo hacer esto?


Título: Re: Enviar mensaje a la consola
Publicado por: [D4N93R] en 7 Agosto 2010, 06:26 am
Hay una forma más fácil, no se si te funcione, es algo así:
Código
  1. [DllImport("user32.dll", EntryPoint = "FindWindow")]
  2. private static extern IntPtr FindWindow(string lp1, string lp2);
  3.  
  4. [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
  5. [return: MarshalAs(UnmanagedType.Bool)]
  6. private static extern bool SetForegroundWindow(IntPtr hWnd);
  7.  
  8. private void Test()
  9. {
  10.     //Una prueba con el notepad
  11.     IntPtr handle = FindWindow("Notepad", "Untitled - Notepad");
  12.     if (!handle.Equals(IntPtr.Zero))
  13.     {
  14.          if (SetForegroundWindow(handle))
  15.          {
  16.                SendKeys.Send("Hello World!");
  17.                SendKeys.Send("{ENTER}");
  18.           }            
  19.     }
  20. }
  21.  

Lo que hace es activar a esa ventana, y enviar texto como si fuese del teclado. Si no, la forma en que tu lo planteas es algo así:
Código
  1. private const int WM_SETTEXT = 0x000C;
  2. [DllImport("user32.dll")]
  3. private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  4.  
  5. [DllImport("User32.dll")]
  6. private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindows);
  7. [DllImport("User32.dll")]
  8. private static extern Int32 SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, StringBuilder lParam);
  9.  
  10. private void Test()
  11. {
  12.    IntPtr hWnd = FindWindow("Notepad", "Untitled - Notepad");
  13.    if (!hWnd.Equals(IntPtr.Zero))
  14.    {
  15.        IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "Edit", null);
  16.        if (!edithWnd.Equals(IntPtr.Zero))
  17.            SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, new StringBuilder("Hello World!"));
  18.    }
  19. }
  20.  


Título: Re: Enviar mensaje a la consola
Publicado por: CH4ØZ en 7 Agosto 2010, 15:30 pm
mira perdon que no sea tan bueno, pero no logro que el codigo funcione. lo pase a vb.net asi y no anda:

Código
  1. Public Sub test()
  2.    Dim hWnd As Long
  3.    hWnd = FindWindow("Notepad", "Untitled - Notepad")
  4.    If hWnd.Equals(IntPtr.Zero) <> 0 Then
  5.        Dim edithWnd As Long = FindWindowEx(hWnd, IntPtr.Zero, "Edit", vbNull)
  6.        If edithWnd.Equals(IntPtr.Zero) <> 0 Then SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, "Hello World!")
  7.    End If
  8. End Sub
  9.  


Título: Re: Enviar mensaje a la consola
Publicado por: [D4N93R] en 7 Agosto 2010, 16:46 pm
Te da algún mensaje de error o algo?


Título: Re: Enviar mensaje a la consola
Publicado por: CH4ØZ en 7 Agosto 2010, 18:38 pm
puse un try aver si podia tener mas info, pero no.
simplemente no envia el mensaje, compila perfecto :S


Título: Re: Enviar mensaje a la consola
Publicado por: [D4N93R] en 7 Agosto 2010, 21:46 pm
Con cualquier aplicación funciona bien, pero con la consola no, al parecer Windows no deja hacer eso.  Tiene los mensajes Protegidos, aún no le he encontrado solución :(


Título: Re: Enviar mensaje a la consola
Publicado por: CH4ØZ en 8 Agosto 2010, 01:05 am
de ultima si no agregame al msn asi podriamos hablar mejor. mi idea era enviar un texto X a la consola, no importaba la forma, pero no logro hayar la solucion.

mi msn es the_chaoz92@hotmail.com


Título: Re: Enviar mensaje a la consola
Publicado por: seba123neo en 8 Agosto 2010, 02:05 am
Hola, proba esto:

Código
  1. Public Class Form1
  2.  
  3.    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
  4.    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
  5.    Private Const WM_CHAR = &H102
  6.  
  7.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  8.        Dim vHwnd As Integer
  9.        Dim vTexto As String = "Holaaaaaaaaaaaaaaaa como va?"
  10.  
  11.        vHwnd = FindWindow("ConsoleWindowClass", vbNullString)
  12.  
  13.        For i As Integer = 1 To Len(vTexto)
  14.            PostMessage(vHwnd, WM_CHAR, Asc(Mid(vTexto, i, 1)), 0&)
  15.        Next i
  16.  
  17.        PostMessage(vHwnd, WM_CHAR, Asc(vbCr), 0&)
  18.        PostMessage(vHwnd, WM_CHAR, Asc(vbLf), 0&)
  19.    End Sub
  20. End Class

saludos.


Título: Re: Enviar mensaje a la consola
Publicado por: CH4ØZ en 8 Agosto 2010, 11:59 am
no anda seba, a pesar de que cambie el "Dim vHwnd As Integer" por "As Long"  me  sigue diciendo que se proboca un desbordamiento en:
"PostMessage(vHwnd, WM_CHAR, Asc(Mid(vTexto, i, 1)), 0&)"

y no termino de entender porque.

alguien tiene otra idea?


Título: Re: Enviar mensaje a la consola
Publicado por: Keyen Night en 8 Agosto 2010, 17:27 pm
Si estás en Vb.Net las declaraciones de las api's son diferentes, prueba así, ya a mi me funciono, deberia servir ._.

Código
  1. Imports System.Runtime.InteropServices
  2.  
  3. Public Class Form1
  4.  
  5.    <DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)> _
  6. Private Shared Function FindWindowByClass( _
  7. ByVal lpClassName As String, _
  8. ByVal zero As IntPtr) As IntPtr
  9.    End Function
  10.  
  11.    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
  12. Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As String, ByVal lParam As String) As IntPtr
  13.    End Function
  14.  
  15.    Private WM_SETTEXT As Long = &HC
  16.  
  17.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  18.  
  19.        Dim ConsoleHandle As IntPtr = FindWindowByClass("ConsoleWindowClass", IntPtr.Zero)
  20.  
  21.        If ConsoleHandle <> IntPtr.Zero Then
  22.            SendMessage(ConsoleHandle, WM_SETTEXT, 0, "Hello")
  23.        End If
  24.  
  25.    End Sub
  26.  
  27. End Class



Título: Re: Enviar mensaje a la consola
Publicado por: [D4N93R] en 8 Agosto 2010, 17:48 pm
Sï, probé el code de seba123neo y funciona bien, lo que hace es emular el teclado, yo lo que intentaba era mandarle el texto completo. xD

Buena idea seba!

Saludos!


Título: Re: Enviar mensaje a la consola
Publicado por: seba123neo en 8 Agosto 2010, 22:06 pm
no anda seba, a pesar de que cambie el "Dim vHwnd As Integer" por "As Long"  me  sigue diciendo que se proboca un desbordamiento en:
"PostMessage(vHwnd, WM_CHAR, Asc(Mid(vTexto, i, 1)), 0&)"

y no termino de entender porque.

alguien tiene otra idea?

mira a mi me funciona bien, no cambies las declaraciones ni nada porque asi como estan , estan bien, As Long ya no es necesario ahora lo que antes era Long en visual basic 6 se pones As Integer ya que cambiaron los tipos de datos, lo mismo para las api's...por curiosidad que windows tenes?

saludos.


Título: Re: Enviar mensaje a la consola
Publicado por: CH4ØZ en 9 Agosto 2010, 04:05 am
XP 9.5, lo probe en una aplicacion de 0 y funciona perfecto, asi que voy a ver que puedo tener mal en la otra. gracias seba.

solo me quedo una duda, cual es la diferencia entre SendMessage y PostMessage


Título: Re: Enviar mensaje a la consola
Publicado por: [D4N93R] en 9 Agosto 2010, 04:56 am
Usando SendMessage se espera hasta que la ventana a donde enviaste el mensaje lo procese. En cambio PostMessage no espera a que procesen el mensaje.

Saludos.


Título: Re: Enviar mensaje a la consola
Publicado por: seba123neo en 9 Agosto 2010, 05:08 am
serian iguales, solo que cuando envias un mensaje con Sendmessage este no retorna el valor hasta que la ventana procesa el mensaje y entonces ahi te devuelve el resultado, en cambio PostMesaage envia el mensaje dejandolo en la cola de mensajes y no espera por la respuesta del mensaje lo retorna inmediatamente.

lo podes ver todo en la MSDN:

SendMessage Function (http://msdn.microsoft.com/en-us/library/ms644950)

PostMessage Function (http://msdn.microsoft.com/en-us/library/ms644944)

saludos.


Título: Re: Enviar mensaje a la consola
Publicado por: CH4ØZ en 9 Agosto 2010, 05:15 am
muchas gracias a todos por su ayuda. pueden cerrar el topic si quieren.