Enviar mensaje a la consola

Iniciado por CH4ØZ, 5 Agosto 2010, 20:54 PM

0 Miembros y 2 Visitantes están viendo este tema.

seba123neo

Hola, proba esto:

Código (vbnet) [Seleccionar]
Public Class Form1

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    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
    Private Const WM_CHAR = &H102

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim vHwnd As Integer
        Dim vTexto As String = "Holaaaaaaaaaaaaaaaa como va?"

        vHwnd = FindWindow("ConsoleWindowClass", vbNullString)

        For i As Integer = 1 To Len(vTexto)
            PostMessage(vHwnd, WM_CHAR, Asc(Mid(vTexto, i, 1)), 0&)
        Next i

        PostMessage(vHwnd, WM_CHAR, Asc(vbCr), 0&)
        PostMessage(vHwnd, WM_CHAR, Asc(vbLf), 0&)
    End Sub
End Class


saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

CH4ØZ

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?
no me juzguen si no me conocen

Keyen Night

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 (vbnet) [Seleccionar]
Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindowByClass( _
ByVal lpClassName As String, _
ByVal zero As IntPtr) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As String, ByVal lParam As String) As IntPtr
    End Function

    Private WM_SETTEXT As Long = &HC

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConsoleHandle As IntPtr = FindWindowByClass("ConsoleWindowClass", IntPtr.Zero)

        If ConsoleHandle <> IntPtr.Zero Then
            SendMessage(ConsoleHandle, WM_SETTEXT, 0, "Hello")
        End If

    End Sub

End Class


La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

[D4N93R]

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!

seba123neo

Cita de: 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?

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.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

CH4ØZ

#15
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
no me juzguen si no me conocen

[D4N93R]

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.

seba123neo

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

PostMessage Function

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

CH4ØZ

muchas gracias a todos por su ayuda. pueden cerrar el topic si quieren.
no me juzguen si no me conocen