none
atrapar el cursor en un TextBox o un Label

    Pregunta

  •    Hola. Tengo un Formulario con 30 o 40 labels y 1 TextBox. 10 o 12 de ellas hacen cosas al picar dentro, y el TxetBox lo utilizo para leer datos de forma parecida al juego del ahorcado. Es decir, a cada pulsación de tecla haré algo, incluido poner o no, la tecla pulsada en el TextBox, como texto valido de entrada.

       Pretendo que, cuando el usuario esté en la entrada de datos de este TextBox, el cursor quede atrapado dentro de este TextBox, a ser posible en la posicion de la letra a entrar y que solo pueda salir de ahi al pulsar sobre la tecla Escape, por ejemplo.

       He pensado usar también una label para recibir los datos, en vez del del TextBox, y cambiar de color al recibir los datos, pero creo que no tiene el evento Keypress. En verdad no pretendo entrada de datos, sino comparar lo pulsado con otro texto de refrencia. Algo parecido al juego del ahorcado podria servir.

    jueves, 24 de mayo de 2012 18:46

Respuestas

  • Sigue igual

    a mira.... lo acabo de descubrir... usa la clase Cursor para confinar el cursor a un area y para ocultarlo, aunque hace lo mismo que las API, pero ya envuelto.

    Salu2


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:07
    jueves, 24 de mayo de 2012 20:53
  •     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Cursor.Hide()   ' Se pondria cuando se estuviera en captura de texto
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Cursor.Show()   ' Se pondria cuando se pulsara Esc
        End Sub

    Esto casi podría valer, lo que pasa es que cuando saco el cursor de los limites del formulario vuelve a aparecer. O sea, que no vale

    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:07
    jueves, 24 de mayo de 2012 23:50
  • Ahora si:

    Public Class Form1
        Private Sub TextBox2_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.GotFocus
            Cursor.Hide()
        End Sub

        Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
            Dim tecla As Integer = Asc(e.KeyChar)
            If tecla = 27 Then      ' Tecla Esc pulsada
                Cursor.Show()
            End If
        End Sub
    End Class

        Así si funciona como yo quería, pero con dos pegas:

    1) Al arrancar la aplicación el foco aparece en el TextBox1, haciendo invisible el cursor. he intentado que el foco este en otro lado (TextBox2) con 

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

    pero no lo consigo. Sigue arrancando con el foco en TextBox1 y quedando invisible el cursor. Solución Usar TextBox2 para leer los datos

    2) Al pulsar Esc sigue el foco en el TextBox  de entrada de datos (TextBox2), que no es lo que quiero, ya que el usuario puede seguir tecleando texto ahí. Estaria entonces como al principio. No se como quitar el foco del  TextBox2 después de hacer visible el cursor al pulsar Esc.

       ToniAg: También probé con Validating, pero hace exactamente lo mismo que quitandolo, así que lo quite. Me da que no controlo lo del Validating, por que parto de la base de que Leandro sabe lo que esta diciendo.

       Ah, es verdad eso de que, visible o no, el cursor sigue activo, pero lo considero un mal menor aceptable. Si alguno sabeis como evitarlo os escucho

    Gracias. Saludos

       Ya averigue como pasar el foco a otro lado

        Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
            Dim tecla As Integer = Asc(e.KeyChar)
            If tecla = 27 Then      ' Tecla Esc pulsada
                Cursor.Show()
                SendKeys.Send("{TAB}")
            End If
        End Sub

    • Editado AmFor viernes, 25 de mayo de 2012 11:27
    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:08
    viernes, 25 de mayo de 2012 11:16
  • Hola

    Puedes poner TextBox2.Focus en el eventos Shown del form

        Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
            TextBox2.Focus()
        End Sub

    Y si quieres que pierda el enfoque el textbox2 y no puedan ingresar texto hasta que una condicion no lo permita, puedes desabilitar el control

    TextBox2.enabled=False ' deshabilitado
    TextBox2.enabled=True' habilitar

    o

     TextBox2.ReadOnly = False ' permite escritura
     TextBox2.ReadOnly = True ' no permite escritura

    o

    por que no pones 
           If tecla = 27 Then      ' Tecla Esc pulsada
                Cursor.Show()
               textbox1.focus()

            End If



    • Editado ToniAG viernes, 25 de mayo de 2012 12:05
    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:08
    viernes, 25 de mayo de 2012 11:58
  • Puedes poner TextBox2.Focus en el eventos Shown del form

    Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
            TextBox2.Focus()
        End Sub

    ---> Esto no va. Pone el cursor del TextBox, pero no cambia el foco. éste sigue estando en el TextBox1. => Se oculta el raton

    TextBox2.enabled=False ' deshabilitado
    TextBox2.enabled=True' habilitar

    TextBox2.ReadOnly = False ' permite escritura
    TextBox2.ReadOnly = True ' no permite escritura

    Esto me lo apunto, que me hará falta y si que funciona

           If tecla = 27 Then      ' Tecla Esc pulsada 
                Cursor.Show()
               textbox1.focus()

            End If

    Esto de textbox1.focus()  también me vale, mejor que el TAB y añadiré    If tecla = 27 Or tecla = 13 Then      ' Tecla Esc o Enter pulsada

    Lo que no termino de entender es porque funciona aquí y no en el Private Sub Form1_Shown o en Private Sub Form1_Load




    • Editado AmFor viernes, 25 de mayo de 2012 13:01
    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:06
    viernes, 25 de mayo de 2012 12:57

Todas las respuestas

  • hola...

    Hay varios problemas en este caso...

    1. para conservar la posicion del cursor creo que en el evento change deberias calcular la longitud del texto ingresado en una variable global.

    Posicion = textbox1.text.lengh

    2. para evitar que el cursor se mueva a otra posicion, en el evento keydown deberas eliminar la pulsacion de la tecla <flecha izquerda>, <flecha derecha>, <home>, <end> asi mas o menos:

    If e.KeyCode = Keys.Left Then
        e.SuppressKeyPress = True
    end if

    3. Para cuando quiera reubicar el cursor con el mouse, en el evento clic puedes hacer halgo asi:

    TextBox1.SelectionStart = Posicion

    4 y para que cuando puse escape, salgas del textbox, puedes envair un tab en ves del escape: (en el evento keydown)

    If e.KeyCode = Keys.esc Then
          e.SuppressKeyPress = True
          SendKeys.Send("{TAB}")
    END IF

    para atrapar el cursor.. en el evento LostFocus del textbox

    TextBox1.Focus()

    creo que con eso ya puedes hacer algo...

    Saludos...

    SI TE SIRVIO LA RESPUESTA, MARCALA COMO VALIDA.


    EnterpriseSoft Perú Chachapoyas - Amazonas - Perú.



    • Editado Terricolaw jueves, 24 de mayo de 2012 19:17
    jueves, 24 de mayo de 2012 19:07
  • He pensado usar también una label para recibir los datos,

    el label es un control que no permite el ingreso de informacion, solo mostrarla, por lo que este camino que planteas no lo veo valido

    cuando el usuario esté en la entrada de datos de este TextBox, el cursor quede atrapado dentro de este TextBox,

    podrias programar esto para todos los evento usando el keypress en union con Validating

    el Validating evita que quites el foco hasta tanto el keypress no detecte que se presiona el Esc

    Private puedesalir = False
    
    Private Sub text_GotFocus(...)
    
       puedesalir = False
    
    End Sub
    
    Private Sub text_Validating(..)
    
       If Not puedesalir Then
    
          e.Cancel = True;
    
       End If
    
    End Sub
    
    Private Sub text_KeyPress(...)
    
      If e.KeyValue = Keys.Escape Then
    
         puedesalir  = False
    
      End If
    
    End Sub

    como veras suas la variable de flag

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 24 de mayo de 2012 19:31
  • Terricolaw:

     Todo esta casi perfecto (no sea que venga otro y lo mejore aun mas), pero el punto principal no se consigue. El cursor del ratón, -la punta de flecha- , puede hacer click en cualquier otro lado, otro TextBox, por ejemplo. Lo que realmente me gustaria es que no saliera de ahi, del TextBox. Lo ideal seria que el cursor del ratón, -la punta de flecha- pudiera moverse libremente por el TextBox, pero al intentar sacarlo de su contorno, se quedara como pegado a la pared. En su defecto podría valer que, sencillamente no apareciera (no sea visible la punta de flecha NI AL TENER EL FOCO ni en momento alguno), hasta que se pulse Esc (lo del TAB no lo he pillado bien, te refieres a la tecla TABulador) o, de verse, que no salga del recuadro del TextBox. Como mal menor, aunque no es lo que ando buscando, que desaparezca el cursor cuando se mueve fuera del TextBox. 

       Es, como diria?, como hacer un programa para subnormales, de forma que quede claro, sin ninguna duda que, o metes texto, o metes texto... o sales

    Leandro:

       Me perdí. tendré que mirarlo despacio

    Gracias. Saludos


    • Editado AmFor jueves, 24 de mayo de 2012 19:37
    jueves, 24 de mayo de 2012 19:35
  • para atrapar el cursor.. en el evento LostFocus del textbox

    TextBox1.Focus()
    TextBox1.SelectionStart = Posicion

    Saludos


    SI TE SIRVIO LA RESPUESTA MARCALA COMO VALIDA. EnterpriseSoft Perú Chachapoyas - Amazonas - Perú.


    • Editado Terricolaw jueves, 24 de mayo de 2012 19:43
    jueves, 24 de mayo de 2012 19:40
  • Sigue igual
    jueves, 24 de mayo de 2012 20:31
  • Terricolaw:

     Todo esta casi perfecto (no sea que venga otro y lo mejore aun mas), pero el punto principal no se consigue. El cursor del ratón, -la punta de flecha- , puede hacer click en cualquier otro lado, otro TextBox, por ejemplo. Lo que realmente me gustaria es que no saliera de ahi, del TextBox. Lo ideal seria que el cursor del ratón, -la punta de flecha- pudiera moverse libremente por el TextBox, pero al intentar sacarlo de su contorno, se quedara como pegado a la pared. En su defecto podría valer que, sencillamente no apareciera (no sea visible la punta de flecha NI AL TENER EL FOCO ni en momento alguno), hasta que se pulse Esc (lo del TAB no lo he pillado bien, te refieres a la tecla TABulador) o, de verse, que no salga del recuadro del TextBox. Como mal menor, aunque no es lo que ando buscando, que desaparezca el cursor cuando se mueve fuera del TextBox. 

       Es, como diria?, como hacer un programa para subnormales, de forma que quede claro, sin ninguna duda que, o metes texto, o metes texto... o sales

    Leandro:

       Me perdí. tendré que mirarlo despacio

    Gracias. Saludos


    para este punto tendras que valerte de las API de windows para confinar el cursor a un area especifica o para ocultarlo, pero!!!!... el cursor del mouse es un recurso compartido, así que si cambias de aplicación (thread) en el caso de confinarlo, lo tendras que liberar (lo recomendado, pero el se libera solo) y en el caso de ocultar se vuelve visible.

    así que las API que necesitas son:

    GetCursorInfo, GetClipCursor, ClipCursor, ShowCursor.

    y un pequeño ejemplo:

    Imports System.Runtime.InteropServices
    
    Public Class Form9
    
        Declare Function GetCursorInfo Lib "user32.dll" (ByRef ci As CURSORINFO) As Boolean
        Declare Function GetClipCursor Lib "user32.dll" (ByRef lprc As RECT) As Boolean
        <DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
        Public Shared Function ClipCursor(ByRef rcClip As RECT) As Boolean
        End Function
        <DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
        Public Shared Function ShowCursor(ByVal bShow As Boolean) As Integer
        End Function
        <StructLayout(LayoutKind.Sequential)> _
        Public Structure RECT
            Public Left, Top, Right, Bottom As Integer
            Sub New(ByRef bounds As Rectangle)
                Me.Left = bounds.Left
                Me.Top = bounds.Top
                Me.Right = bounds.Right
                Me.Bottom = bounds.Bottom
            End Sub
            Public Sub Inflate(ByRef x As Integer, ByRef y As Integer)
                Me.Left -= x
                Me.Top -= y
                Me.Right += x
                Me.Bottom += y
            End Sub
            Public Function ToRectangle() As Rectangle
                Return Rectangle.FromLTRB(Me.Left, Me.Top, Me.Right, Me.Bottom)
            End Function
            Public ReadOnly Property Height() As Integer
                Get
                    Return Me.Bottom - Me.Top
                End Get
            End Property
            Public ReadOnly Property Width() As Integer
                Get
                    Return Me.Right - Me.Left
                End Get
            End Property
        End Structure
        <StructLayout(LayoutKind.Sequential)> _
        Public Structure PPOINT
            Public x As Integer
            Public y As Integer
        End Structure
        <StructLayout(LayoutKind.Sequential)> _
        Public Structure CURSORINFO
            Public cbSize As Integer
            Public flags As Integer
            Public hCursor As IntPtr
            Public ptScreenPos As PPOINT
        End Structure
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
            If Me.RadioButton1.Checked Then
                Dim rect As New RECT()
    
                ' Obtenemos area actual de confinación del cursor 
                If GetClipCursor(rect) Then
    
                    If Not rect.ToRectangle().Equals(Screen.PrimaryScreen.Bounds) Then
                        ' El area actual confinada no es igual al area de la pantalla, se restablce.
                        ClipCursor(New RECT(Screen.PrimaryScreen.Bounds))
                    Else
                        Dim screenLocation As Point = Me.PointToScreen(Me.Button1.Location)
                        Dim confinesRect As New Rectangle(screenLocation.X, screenLocation.Y, Me.Button1.Width, Me.Button1.Height)
                        ' Se confina el cursor al area del control
                        ClipCursor(New RECT(confinesRect))
                    End If
    
                End If
            End If
    
            If Me.RadioButton2.Checked Then
                Dim ci As New CURSORINFO
                ci.cbSize = Marshal.SizeOf(GetType(CURSORINFO))
                If GetCursorInfo(ci) Then
                    ' Muestra u oculta el cursor.
                    ShowCursor(ci.flags = 0)
                End If
            End If
    
        End Sub
    
        Private Sub Form9_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    
            ' Restablecer area del cursor o visualizacion del cursor.
            If Me.RadioButton1.Checked Then
                Dim rect As New RECT
                If GetClipCursor(rect) Then
                    If Not rect.ToRectangle.Equals(Screen.PrimaryScreen.Bounds) Then
                        ClipCursor(New RECT(Screen.PrimaryScreen.Bounds))
                    End If
                End If
            End If
            If Me.RadioButton2.Checked Then
                Dim ci As New CURSORINFO
                ci.cbSize = Marshal.SizeOf(GetType(CURSORINFO))
                If GetCursorInfo(ci) And ci.flags = 0 Then _
                    ShowCursor(True)
            End If
    
        End Sub
    End Class

    lo que he hecho es crear un formulario de prueba, y he agregado un boton y dos radiobuttons "confinar cursor" y "ocultar cursor", al precionar el boton dependiente del radiobutton seleccionado, confina el cursor al area del boton o lo oculta, y al cerrarse el formulario lo restablecer por cualquier cosa.

    si lo implementas, lo mejor seria crear una clase segun los controles a implementar y en esta clase colocar tal logica para que sea facil de implementar....

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    jueves, 24 de mayo de 2012 20:37
  • pudiera moverse libremente por el TextBox, pero al intentar sacarlo de su contorno

    usa el evento Validating, con este seguro evitas quitar el foco del control hasta que no este correcto y se habilite


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 24 de mayo de 2012 20:49
  • Sigue igual

    a mira.... lo acabo de descubrir... usa la clase Cursor para confinar el cursor a un area y para ocultarlo, aunque hace lo mismo que las API, pero ya envuelto.

    Salu2


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:07
    jueves, 24 de mayo de 2012 20:53
  • Respondiendo a todos:

    -Leandro: Seguramente funcionara lo que dices de Validating, pero mis conocimientos no me dejan entender lo que has puesto. Solo veo 3 Subrutinas. La primera pone la variable puedesalir en False al recibir el foco, y la ultima vuelve aponer la variable en verdadero al pulsar Esc., la del medio tiene una orden   e.Cancel = True   que no se que hace. Entiendo que es una Sub creada por ti a la que has llamado Validating, como podría ser pepitaperez. Seguramente no sera asi, pero es lo que yo veo. disculpa mi ignorancia.

    -Terricolaw. No hace nada, en ninguno de los dos casos

    -Marvin: Lo de las APIS de Windows. Mis conocimientos no llegan ahí. lo siento. Después del curro que te has pegado, prometo meterme de lleno en ellas a ver si saco algo en claro y probar el código que pones. Puff !!, me veo muy violento con esto por no entender las cosas que me ponéis. Mis disculpas. El código voy a probarlo, a ver si consigo hacer que funcione. Entenderlo, si lo consigo, me va a llevar mas tiempo que a ti escribirlo, seguro. lo siento.

       Sin que sirva de escusa, aunque se ven bien porque estan definidas con DIM, me resulta muy complicado diferenciar los nombre de los comandos -en Ingles- de las variables o Subrutinas que creais -en Ingles-. LostFocus podria ser un comando vbasic  o una variable, o el nombre de un evento, o que se yo. Lo que si esta claro es que si pusiera ... FocoPerdido o aLaMierdaElFoco, ahi no habría dudas, pero entiendo que es mucho mas claro y corto en ingles y por eso lo usais, sobretodo si sabes distinguir cuando es una cosa y cuando otra, que no es mi caso.

       Lo de la clase Cursor me parece muy interesante y voy a empezar por ahí (a ver si consigo algo). Aunque te diré que eso que, con tanta soltura dices de "usa la usa la clase Cursor para ... "  es como si yo le digo a mi abuela "está en internet, miralo". Lamento no poder marcar la respuesta, no se cual es.

       Mi mas sincero agradecimiento a todos

       Saludos

    jueves, 24 de mayo de 2012 23:33
  •     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Cursor.Hide()   ' Se pondria cuando se estuviera en captura de texto
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Cursor.Show()   ' Se pondria cuando se pulsara Esc
        End Sub

    Esto casi podría valer, lo que pasa es que cuando saco el cursor de los limites del formulario vuelve a aparecer. O sea, que no vale

    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:07
    jueves, 24 de mayo de 2012 23:50
  •     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Cursor.Hide()   ' Se pondria cuando se estuviera en captura de texto
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Cursor.Show()   ' Se pondria cuando se pulsara Esc
        End Sub

    Esto casi podría valer, lo que pasa es que cuando saco el cursor de los limites del formulario vuelve a aparecer. O sea, que no vale

    lo que has comentado aquí es el funcionamiento normal, ni con las API de windows vas a poder ocultar el cursor para todo el windows, bueno!!!!... lo asumo por lo que dice la API... igual si usas la propiedad Cursor.Clip para limitar al cursor dentro del área del control al cambiar de aplicación este sera liberado de su confinamiento, porque el cursor es un recurso compartido del Windows.

    pero lo estas aplicando bien...

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    viernes, 25 de mayo de 2012 0:53
  • la del medio tiene una orden   e.Cancel = True   que no se que hace

    si revisas la documentacion del evento, veras que simple e.Cancel evita que se quite el foco del control, noe ra eso lo que buscas ?

    Entiendo que es una Sub creada por ti a la que has llamado Validating

    no es ningun sub creado por mi es un evento lo que debes definir

    eso que puse alli son tes evento del control TextBox

    digo sabes lo que es un evento no ? y como crearlos en los controles, por eso es lo que alli defino, si ves que uses ... es porque se supone que eso lo crea de form automatica el VS


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 25 de mayo de 2012 1:23
  •   Bueno, creo que ya lo tengo, (dentro de los limites que dice Marvin, de no poder ocultar el cursor para todo el windows):

       Se trata de usar los tres eventos que dice  Leandro (que ya entiendo) y  Cursor.Hide() y Cursor.Show()

    Validate (Evento, controles ActiveX)

    Se produce antes de que el foco pase a (otro) control que tiene la propiedad CausesValidation establecida en True.

    Sintaxis

    Private Sub object_Validate(KeepFocus As Boolean)

    La sintaxis del evento Validate consta de las siguientes partes:

    Parte Descripción
    object Una expresión de objeto que da como resultado un objeto de la lista Se aplica a.
    KeepFocus Valor que determina si el control pierde el foco. Si se establece KeepFocus en True se indica que el control mantiene el foco.

    Comentarios

    El evento Validate funciona conjuntamente con la propiedad CausesValidation para impedir que un control pierda el foco hasta que se satisfacen ciertos criterios.

    Importante   El evento Validate sólo se produce cuando el control que va a recibir el foco tiene la propiedad CausesValidation establecida en True.

    que viene bien explicado aquí y con con un ejemplo http://msdn.microsoft.com/es-es/library/cc438322(v=vs.71).aspx 

    Muchas gracias a todos. No se que respuesta marcar.

    Un saludo

    viernes, 25 de mayo de 2012 6:40
  • Yo creo que la mejor opción es la que te da Leandro con la Validación del control, da igual si tienes el cursor del ratón por la pantalla, no podrás hacer nada (Dentro de tu proyecto) hasta que el control no te de permiso.

    Lo puedes ocultar con el método Hide del cursor, pero aun a sin será operativo

    Puedes utilizar el size del cursor para restringir el movimiento del ratón, pero si sales del form se liberara, aun a sin podrías volver a restringir el ratón en el evento de Activated del form, que se produce cada vez que se activa el form. Pero tendrías que controlar el teclado ya que con el TAB podrías cambiar a otro control

    Respecto a marcar la respuesta, marca la que te ha ayudado para resolver el anunciado, una o varias respuesta

    Saludos

    viernes, 25 de mayo de 2012 9:42
  • Ahora si:

    Public Class Form1
        Private Sub TextBox2_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.GotFocus
            Cursor.Hide()
        End Sub

        Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
            Dim tecla As Integer = Asc(e.KeyChar)
            If tecla = 27 Then      ' Tecla Esc pulsada
                Cursor.Show()
            End If
        End Sub
    End Class

        Así si funciona como yo quería, pero con dos pegas:

    1) Al arrancar la aplicación el foco aparece en el TextBox1, haciendo invisible el cursor. he intentado que el foco este en otro lado (TextBox2) con 

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

    pero no lo consigo. Sigue arrancando con el foco en TextBox1 y quedando invisible el cursor. Solución Usar TextBox2 para leer los datos

    2) Al pulsar Esc sigue el foco en el TextBox  de entrada de datos (TextBox2), que no es lo que quiero, ya que el usuario puede seguir tecleando texto ahí. Estaria entonces como al principio. No se como quitar el foco del  TextBox2 después de hacer visible el cursor al pulsar Esc.

       ToniAg: También probé con Validating, pero hace exactamente lo mismo que quitandolo, así que lo quite. Me da que no controlo lo del Validating, por que parto de la base de que Leandro sabe lo que esta diciendo.

       Ah, es verdad eso de que, visible o no, el cursor sigue activo, pero lo considero un mal menor aceptable. Si alguno sabeis como evitarlo os escucho

    Gracias. Saludos

       Ya averigue como pasar el foco a otro lado

        Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
            Dim tecla As Integer = Asc(e.KeyChar)
            If tecla = 27 Then      ' Tecla Esc pulsada
                Cursor.Show()
                SendKeys.Send("{TAB}")
            End If
        End Sub

    • Editado AmFor viernes, 25 de mayo de 2012 11:27
    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:08
    viernes, 25 de mayo de 2012 11:16
  • Hola

    Puedes poner TextBox2.Focus en el eventos Shown del form

        Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
            TextBox2.Focus()
        End Sub

    Y si quieres que pierda el enfoque el textbox2 y no puedan ingresar texto hasta que una condicion no lo permita, puedes desabilitar el control

    TextBox2.enabled=False ' deshabilitado
    TextBox2.enabled=True' habilitar

    o

     TextBox2.ReadOnly = False ' permite escritura
     TextBox2.ReadOnly = True ' no permite escritura

    o

    por que no pones 
           If tecla = 27 Then      ' Tecla Esc pulsada
                Cursor.Show()
               textbox1.focus()

            End If



    • Editado ToniAG viernes, 25 de mayo de 2012 12:05
    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:08
    viernes, 25 de mayo de 2012 11:58
  • El evento validating del textBox2

        Private Sub TextBox2_Validating(sender As System.Object, _
                                        e As System.ComponentModel.CancelEventArgs) _
                                    Handles TextBox2.Validating

            ' si el campo de TextoBox esta vacio no te dejara salir del control
            If TextBox2.Text = String.Empty Then
                e.Cancel = True ' cancela la salida del control
            End If

        End Sub

    viernes, 25 de mayo de 2012 12:10
  • Puedes poner TextBox2.Focus en el eventos Shown del form

    Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
            TextBox2.Focus()
        End Sub

    ---> Esto no va. Pone el cursor del TextBox, pero no cambia el foco. éste sigue estando en el TextBox1. => Se oculta el raton

    TextBox2.enabled=False ' deshabilitado
    TextBox2.enabled=True' habilitar

    TextBox2.ReadOnly = False ' permite escritura
    TextBox2.ReadOnly = True ' no permite escritura

    Esto me lo apunto, que me hará falta y si que funciona

           If tecla = 27 Then      ' Tecla Esc pulsada 
                Cursor.Show()
               textbox1.focus()

            End If

    Esto de textbox1.focus()  también me vale, mejor que el TAB y añadiré    If tecla = 27 Or tecla = 13 Then      ' Tecla Esc o Enter pulsada

    Lo que no termino de entender es porque funciona aquí y no en el Private Sub Form1_Shown o en Private Sub Form1_Load




    • Editado AmFor viernes, 25 de mayo de 2012 13:01
    • Marcado como respuesta AmFor viernes, 25 de mayo de 2012 13:06
    viernes, 25 de mayo de 2012 12:57
  • Ya he entendido, pero hace lo mismo poniendolo que no. Sale, este vacio o no el campo del TextBox, al pulsar Esc o Enter
    viernes, 25 de mayo de 2012 13:05
  • El CausesValidation del control esta en true

    TextBox2.CausesValidation= True

    viernes, 25 de mayo de 2012 13:10
  • Si. esta asi por defecto. no tuve que cambiar nada
    viernes, 25 de mayo de 2012 13:13
  • En realidad tiene que estar los dos controles en que tiene el enfoque y el que va a recibir el enfoque

    TextBox1.CausesValidation= True

    TextBox2.CausesValidation= True

     a todos los controles hay que dejarlo con el causesvalidation en true

    viernes, 25 de mayo de 2012 13:16
  • Estan asi por defecto; controles y formulario
    viernes, 25 de mayo de 2012 13:18