Ayuda para ejecute un tipo comando

Iniciado por pablomillon, 16 Marzo 2015, 21:29 PM

0 Miembros y 1 Visitante están viendo este tema.

pablomillon

Bueno lo que yo quiero esque al escribir una palabra me haga una acción por ejemplo "escribo /Speed y que el form me detecte la palabra que salga en el label1 cambie de nombre"
intete
If SendKeys.Send("/Speed") And SendKeys.Send("{enter}") Then
            label1.text = "Ejecutado correctamente"
        End If

Pero me marca error ayuda!

tincopasan

1) ¿por qué no ponés un textbox que al presionar "enter" realice la acción que quieras?
2) sendleys lee o toma o envía como quieras decirlo cada una de las teclas presionadas de forma individual.
3) por lo tanto por un lado deberías comparar que la cadena "speed" esté escrita y por otro que al presionar "Enter" haga lo que quieras
4)por ejemplo: en la función del textbox Private Sub Text1_KeyPress(KeyAscii As Integer)
si  KeyAscii = 13 entonces
si textbox.texto = "speed" entonces
label.texto = "correcto"
final si
final si
final función del textbox
5) lo que me lleva a usar solo Keyascii en lugar de sendkeys
6) por supuesto que puedo estar totalmente errado!

pablomillon

Pero yo quiero escribir la Palabra afuera del form ejemplo si Aqui escribiera "Speed" que me marque la accion en el form

tincopasan

pues en ese caso podrías usar la api GetAsyncKeyState para detectar las teclas pulsadas.

okik

#4
Hola
Podría ser algo así  :silbar:

--Se necesita---
-1 control Timer
-1 Label
-1 Textbox


Código (vbnet) [Seleccionar]
Public Class Form1
   Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Int32) As Int32
   Dim RegistrerKeys As String 'Aquí se registran las teclas pulsadas
   Dim Comando As String
   Dim cont As Long
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       TextBox1.Visible = False
       Timer1.Enabled = True
       'Ojo con esto, cuanto menor sea el valor'interval' más
       'rápido hay que teclear para detectar la palabra pulsada
       Timer1.Interval = 70
       Comando = "Speed"
   End Sub


   Public Function IsCommand(ByVal Command As String, ByVal Cadena As String, ByVal objText As TextBox) As Boolean
       Dim C As Integer
       objText.Text = Cadena
       C = InStr(1, Cadena, Command, 1) 'posición en el que se encuentra el elemento buscado
       On Error GoTo NoPalabra
       objText.SelectionStart = C - 1
       objText.SelectionLength = Len(Command)
       If Len(Command) > 0 Then IsCommand = True
NoPalabra:

   End Function

   Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       Dim msg As Boolean, S As Long, i As Long
       S = 0
       'Detecta las pulsaciones de teclas y las introduce en Registrerkeys
       For i = 65 To 90 '65 a 90 representan letras de la A a Z
           S = GetKeyState(i) 'Obtiene un valor negativo si se ha pulsado una tecla entre 65 y 90 (de A a Z)
           If S < 0 Then
               RegistrerKeys = RegistrerKeys & Chr(i) 'Introduce las letras pulsadas en Registrerkeys
           End If
       Next i
      'Iscommand comprueba si se ha pulsado "speed"
       msg = IsCommand(Comando, RegistrerKeys, TextBox1) 'Busca una palabra en un grupo de  teclas pulsadas
       If msg = True Then
           msg = False
           RegistrerKeys = ""
           TextBox1.Text = ""
           MsgBox("Palabra pulsada: " & Comando)
           Label1.Text = Comando
       End If
   End Sub

End Class



El código no es muy eficiente. Detectará la pulsación de la palabra dependiendo de la velocidad en que pulses. Yo he puesto   Timer1.Interval = 70, así que hay que pulsar las teclas muy brevemente. Por ejemplo si mantengo una tecla demasiado tiempo, por ejemplo la "P", el programa detecta "SPPPPEED", y por lo tanto no la da por válida.

pablomillon

Gracias amigos me sirvieron los dos consejos gracias.

pablomillon

Una pregunta quiero agregar otro comando ya pero solo me lee el primer comando los demas no me ejecuta miren como estaPublic Class Form1
    Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Int32) As Int32
    Dim RegistrerKeys As String 'Aquí se registran las teclas pulsadas
    Dim Comando As String
    Dim Comando2 As String
    Dim Comando3 As String
    Dim Comando4 As String
    Dim cont As Long
   
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim msg As Boolean, S As Long, i As Long
        S = 0
        'Detecta las pulsaciones de teclas y las introduce en Registrerkeys
        For i = 65 To 90 '65 a 90 representan letras de la A a Z
            S = GetKeyState(i) 'Obtiene un valor negativo si se ha pulsado una tecla entre 60 y 90 (de A a Z)
            If S < 0 Then
                RegistrerKeys = RegistrerKeys & Chr(i) 'Introduce las letras pulsadas en Registrerkeys
            End If
        Next i
        'Iscommand comprueba si se ha pulsado "speed"
        msg = IsCommand(Comando, RegistrerKeys, TextBox1) 'Busca una palabra en un grupo de  teclas pulsadas
        If msg = True Then
            msg = False
            RegistrerKeys = False
            TextBox1.Text = ""
            MsgBox("Comando ejecutado: " & Comando)
            Label1.Text = Comando
        End If
       
       
       
       
    End Sub





    Public Function IsCommand(ByVal Command As String, ByVal Cadena As String, ByVal objText As TextBox) As Boolean
        Dim C As Integer
        objText.Text = Cadena
        C = InStr(1, Cadena, Command, 1) 'posición en el que se encuentra el elemento buscado
        On Error GoTo NoPalabra
        objText.SelectionStart = C - 1
        objText.SelectionLength = Len(Command)
        If Len(Command) > 0 Then IsCommand = True
NoPalabra:
    End Function




    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Label1.Text = "speed" Then
            Form2.Show()

 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Visible = False
        Timer1.Enabled = True
        Timer5.Enabled = True
        Timer6.Enabled = True
        Timer7.Enabled = True
        'Ojo con esto, cuanto menor sea el valor'interval' más
        'rápido hay que teclear para detectar la palabra pulsada
        Timer1.Interval = 120
        Comando = "speed"
        Comando2 = "ayuda"
        Comando3 = "creador"
        Comando4 = "web"
    End Sub

   

       
   
   

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        ListBox1.Visible = True
    End Sub

    Private Sub Timer5_Tick(sender As Object, e As EventArgs) Handles Timer5.Tick
        Dim msg As Boolean, S As Long, i As Long
        S = 0
        'Detecta las pulsaciones de teclas y las introduce en Registrerkeys
        For i = 65 To 90 '65 a 90 representan letras de la A a Z
            S = GetKeyState(i) 'Obtiene un valor negativo si se ha pulsado una tecla entre 60 y 90 (de A a Z)
            If S < 0 Then
                RegistrerKeys = RegistrerKeys & Chr(i) 'Introduce las letras pulsadas en Registrerkeys
            End If
        Next i
        'Iscommand comprueba si se ha pulsado "speed"
        msg = IsCommand(Comando, RegistrerKeys, TextBox1) 'Busca una palabra en un grupo de  teclas pulsadas
        If msg = True Then
            msg = False
            RegistrerKeys = False
            TextBox5.Text = ""
            MsgBox("Comando ejecutado: " & Comando3)
            Label1.Text = Comando
        End If
    End Sub
   

    Private Sub Timer6_Tick(sender As Object, e As EventArgs) Handles Timer6.Tick
        Dim msg As Boolean, S As Long, i As Long
        S = 0
        'Detecta las pulsaciones de teclas y las introduce en Registrerkeys
        For i = 65 To 90 '65 a 90 representan letras de la A a Z
            S = GetKeyState(i) 'Obtiene un valor negativo si se ha pulsado una tecla entre 60 y 90 (de A a Z)
            If S < 0 Then
                RegistrerKeys = RegistrerKeys & Chr(i) 'Introduce las letras pulsadas en Registrerkeys
            End If
        Next i
        'Iscommand comprueba si se ha pulsado "speed"
        msg = IsCommand(Comando, RegistrerKeys, TextBox1) 'Busca una palabra en un grupo de  teclas pulsadas
        If msg = True Then
            msg = False
            RegistrerKeys = False
            TextBox4.Text = ""
            MsgBox("Comando ejecutado: " & Comando2)
            Label1.Text = Comando
        End If
    End Sub

    Private Sub Timer7_Tick(sender As Object, e As EventArgs) Handles Timer7.Tick
        Dim msg As Boolean, S As Long, i As Long
        S = 0
        'Detecta las pulsaciones de teclas y las introduce en Registrerkeys
        For i = 65 To 90 '65 a 90 representan letras de la A a Z
            S = GetKeyState(i) 'Obtiene un valor negativo si se ha pulsado una tecla entre 60 y 90 (de A a Z)
            If S < 0 Then
                RegistrerKeys = RegistrerKeys & Chr(i) 'Introduce las letras pulsadas en Registrerkeys
            End If
        Next i
        'Iscommand comprueba si se ha pulsado "speed"
        msg = IsCommand(Comando, RegistrerKeys, TextBox1) 'Busca una palabra en un grupo de  teclas pulsadas
        If msg = True Then
            msg = False
            RegistrerKeys = False
            TextBox6.Text = ""
            MsgBox("Comando ejecutado: " & Comando4)
            Label1.Text = Comando
        End If

okik

#7
Cita de: pablomillon en 18 Marzo 2015, 03:58 AM
Una pregunta quiero agregar otro comando ya pero solo me lee el primer comando los demas no me ejecuta miren como esta

Hola,

Fallo mío. Puse sólo un comando y debí imaginar que querías más de uno. Para ello no hace falta crear un 'Timer' para cada comando. Basta con crear un Array (matriz) para la variable Comando:


Dim Comando(0 To 3) As String
.....

       Comando(0) = "Speed"
       Comando(1) = "ayuda"
       Comando(2) = "creador"
       Comando(3) = "web"
.....

Y luego  añadir For/Next en el control Timer:

      For i = 1 To UBound(Comando)
           msg = IsCommand(Comando(i), RegistrerKeys, TextBox1) 'Busca una palabra en un grupo de  teclas pulsadas
           'Iscommand comprueba si se ha pulsado "speed"
           If msg = True Then
               msg = False
               RegistrerKeys = ""
               TextBox1.Text = ""
               Label1.Text = Comando(i)
           End If
        Next i

....

Ubound sirve para obtener la dimensión del Array. Por ejemplo, si fuese:

Dim Comando(0 To 10) As String

Entonces UBound(Comando) daría 10

¿Y porqué no poner Comando(1 to 4)? Porque VB.Net no deja hacerlo. El mínimo es 0.

Así quedaría el código, finalmente:
Código (vbnet) [Seleccionar]
Public Class Form1
   Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Int32) As Int32
   Dim RegistrerKeys As String 'Aquí se registran las teclas pulsadas
   Dim Comando(0 To 3) As String
   Dim cont As Long
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       TextBox1.Visible = False
       Timer1.Enabled = True
       'Ojo con esto, cuanto menor sea el valor'interval' más
       'rápido hay que teclear para detectar la palabra pulsada
       Timer1.Interval = 120
       Comando(0) = "Speed"
       Comando(1) = "ayuda"
       Comando(2) = "creador"
       Comando(3) = "web"
   End Sub


   Public Function IsCommand(ByVal Command As String, ByVal Cadena As String, ByVal objText As TextBox) As Boolean
       Dim C As Integer
       objText.Text = Cadena
       C = InStr(1, Cadena, Command, 1) 'posición en el que se encuentra el elemento buscado
       On Error GoTo NoPalabra
       objText.SelectionStart = C - 1
       objText.SelectionLength = Len(Command)
       If Len(Command) > 0 Then IsCommand = True
NoPalabra:

   End Function

   Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       Dim msg As Boolean, S As Long, i As Long
       S = 0
       'Detecta las pulsaciones de teclas y las introduce en Registrerkeys
       For i = 65 To 90 '65 a 90 representan letras de la A a Z
           S = GetKeyState(i) 'Obtiene negativo si se ha pulsado una tecla entre 65 y 90 (de A a Z)
           If S < 0 Then
               RegistrerKeys = RegistrerKeys & Chr(i) 'Introduce las letras pulsadas en Registrerkeys
           End If
       Next i
       For i = 0 To UBound(Comando)
           msg = IsCommand(Comando(i), RegistrerKeys, TextBox1) 'Busca una palabra en un grupo de  teclas pulsadas
           'Iscommand comprueba si se ha pulsado "speed"
           If msg = True Then
               msg = False
               RegistrerKeys = ""
               TextBox1.Text = ""
               Label1.Text = Comando(i)
               '///===================================
               '///Aquí puedes añadir lo que quieres que ocurra al pulsar el comando
               '///por ejemplo Form2.Show
               '///===================================
           End If
       Next i
   End Sub

End Class



Lo que no entiendo es porqué no usas  Hotkeys, es decir que si el usuario pulsa Ctrl +Shift +F1  por ejemplo, se ejecute la Ayuda.