elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 ... 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [42] 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 ... 1236
411  Programación / .NET (C#, VB.NET, ASP) / Re: [SOURCE-CODE] Easy Link File Viewer en: 16 Agosto 2019, 02:19 am
Version 1.3:

Fixed a visual issue with the menu strip.

Version 1.4:

    Added basic support for command-line arguments. Now you can pass a shortcut's file path to the executable file to open/load the specified shortcut in the program.

    Added a Hexadecimal Viewer (read-only) to view the raw contents of the current loaded shortcut file.

    Other minor UI changes and source-code optimizations.



412  Programación / .NET (C#, VB.NET, ASP) / Re: [SOURCE-CODE] Colección de plugins para SmartBot ( Hearthstone ) en: 16 Agosto 2019, 02:18 am
Versión 3.1:

    AdvancedAutoConcede.dll:
    Fixed an issue in which the number of remaining automatic concedes in the log was not displayed correctly.

    BattleTagCrawler.dll:
    Fixed an issue in which battletags were crawled outside the hour range specified in the plugin configuration window.

    SystemTrayIcon.dll, TaskBarInformer.dll and WindowRestorator.dll:
    All of these three plugins and its features has been joined into a new, single assembly: UIEnhancer.dll

    (So you must manually delete the old assemblies from your plugins directory, in order to avoid possible conflicts.)

    Other Changes:
    Updated the versions of SBAPI.dll, HearthMirror.dll and HearthWatcher.dll assemblies.
413  Programación / Programación Visual Basic / Re: VB.NET redirect obtener todos los enlaces en: 12 Agosto 2019, 14:46 pm
Según la documentación de Microsoft:

    WebBrowser.Navigating event:
        Occurs before the WebBrowser control navigates to a new document

    WebBrowser.Navigated event:
        Occurs when the WebBrowser control has navigated to a new document and has begun loading it.
        ...
        Handle the DocumentCompleted event to receive notification when the WebBrowser control finishes loading the new document.

    WebBrowser.DocumentCompleted event:
        Occurs when the WebBrowser control finishes loading a document
        ...
        Handle the DocumentCompleted event to receive notification when the new document finishes loading. When the DocumentCompleted event occurs, the new document is fully loaded

En resumen, el orden de desencadenamiento de eventos es el sigueinte:

1. WebBrowser.Navigating: cuando comienza la navegación a "X" url.
2. WebBrowser.Navigated: cuando comienza la carga del documento html en la página a navegar.
3. WebBrowser.DocumentCompleted: cuando finaliza la carga del documento html en la página a navegar.

Como no hay tiempo suficiente para que comience la carga del documento html en el ejemplo de código que compartí más arriba, el evento Navigating se dispara para todas las urls, mientras que el evento Navigated se dispara solamente para la última url como puedes comprobar en la imagen que compartí. Si quieres obtener la url de todas las redirecciones antes de que comience la carga del documento para validar/filtrar la url y poder cancelar la navegación o lo que pretendas hacer, entonces deberías seguir usando el evento Navigating como en el ejemplo de código que mostré.



Ya probe un WebBrowser.DocumentCompleted y sigue apareciendo muchas veces el link en mi consola

Para serte sincero, no tengo un gran domino en cosas relacionadas con la programación a nivel web, cosas de html y de páginas web en general, de hecho, de vez en cuando a mi también me surjen algunas dudas con ciertos aspectos del componente WebBrowser. Lo que puedo decirte es que el evento DocumentCompleted puede dispararse múltiples veces, ya que una página puede contener iframes que desencadenen el evento, pero por otro lado el evento Navigating y Navigated solamente debería dispararse una vez por cada url... ¿pero tu dices que no es así?.

De cualquier manera, siempre existe la solución rudimentaria de declarar una variable booleana para evitar, o mejor dicho ignorar múltiples desencadenamientos del mismo evento. Es decir, la primera vez que se dispare el evento DocumentCompleted, le asignarías un valor True a dicha variable, y si se vuelve a disparar el evento solo tienes que comprobar si el valor de la variable es True o False; de esta forma evitas la repetición de tu "validación de url" por así decirlo donde usas esa condicional para comprobar si la url contiene cierta cadena de texto.

Saludos.
414  Programación / Programación Visual Basic / Re: VB.NET redirect obtener todos los enlaces en: 11 Agosto 2019, 13:12 pm
Prueba añadiendo un controlador para el evento WebBrowser.Navigating...

Código
  1. Public Class Form1
  2.  
  3.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4.        Dim urls As String() = {"google.co.jp", "google.co.uk", "google.es", "google.com"}
  5.        For Each url As String In urls
  6.            Me.WebBrowser1.Navigate(url)
  7.        Next
  8.    End Sub
  9.  
  10.    Private Sub WebBrowser1_Navigating(sender As Object, e As WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
  11.        Console.WriteLine($"Starting navigation: {e.Url}")
  12.        Me.ValidateUri(e.Url)
  13.    End Sub
  14.  
  15.    Private Sub WebBrowser1_Navigated(sender As Object, e As WebBrowserNavigatedEventArgs) Handles WebBrowser1.Navigated
  16.        Console.WriteLine($"Completed navigation: {e.Url}")
  17.    End Sub
  18.  
  19.    Private Sub ValidateUri(uri As Uri)
  20.        If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
  21.            ' ...
  22.        End If
  23.    End Sub
  24.  
  25. End Class



Saludos.
415  Programación / .NET (C#, VB.NET, ASP) / Re: [C#] Emular click del ratón en otra aplicación en: 11 Agosto 2019, 12:56 pm
yo de VB se poco

Realmente el código en VB.NET es lo de menos, lo importante es el concepto...

SendMessage y PostMessage en C#:

Conversor offline de código VB.NET a C#:
(mi recomendación personal. puedes encontrar el programa con su "medicina" facilmente)

Conversor online de código VB.NET a C#:
(este puede dar fallos de conversión en comparación con el otro conversor)



Sí vaya error con mi nick, y ahora no lo puedo arreglar... lástima.

Si que puedes. Haz click aquí si deseas cambiarte el nombre a mostrar:

Saludos
416  Programación / .NET (C#, VB.NET, ASP) / Re: [C#] Emular click del ratón en otra aplicación en: 10 Agosto 2019, 17:16 pm
+

PD: por cierto, en tu nickname falta una 'R'...
417  Programación / .NET (C#, VB.NET, ASP) / Re: Timer desde Una Clase en: 9 Agosto 2019, 13:46 pm
quisiera que se estuviera actualizando los valores en el formulario, pero esto no lo esta haciendo, no refresca los valores mostrados

¿Como esperas que eso ocurra, cuando solamente estás "actualizando" los valores una única vez al finalizar la creación de la ventana del Form en este controlador de evento?:

Citar
Código
  1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2. ...

Solucion: añade un Timer (pero del tipo System.Windows.Forms.Timer) a ese Form para actualizar los valores de los controles periodicamente...



Le hice algunos cambios al código en general. Prueba así:

SensorClass.vb
Código
  1. Imports System.IO.Ports
  2. Imports System.Timers
  3.  
  4. Public NotInheritable Class SensorClass : Implements IDisposable
  5.  
  6. #Region "Properties"
  7.  
  8.    Public ReadOnly Property SerialPort As SerialPort
  9.        Get
  10.            Return Me.serialPort_
  11.        End Get
  12.    End Property
  13.    Private serialPort_ As SerialPort
  14.  
  15.    Public ReadOnly Property Output As String
  16.        Get
  17.            Return Me.output_
  18.        End Get
  19.    End Property
  20.    Private output_ As String
  21.  
  22. #End Region
  23.  
  24. #Region "Private Fields"
  25.  
  26.    Private WithEvents TimerSensores As Timer
  27.  
  28. #End Region
  29.  
  30. #Region "Constructors"
  31.  
  32.    <DebuggerStepThrough>
  33.    Public Sub New()
  34.        Me.CommPortSetup()
  35.  
  36.        Me.TimerSensores = New Timer() With {
  37.            .AutoReset = True,
  38.            .Interval = 100,
  39.            .Enabled = True
  40.        }
  41.    End Sub
  42.  
  43. #End Region
  44.  
  45. #Region "Private Methods"
  46.  
  47.    <DebuggerStepThrough>
  48.    Private Sub CommPortSetup()
  49.        Me.serialPort_ = New SerialPort With {
  50.            .PortName = "COM7",
  51.            .BaudRate = 9600,
  52.            .DataBits = 8,
  53.            .StopBits = StopBits.One
  54.        }
  55.  
  56.        Me.serialPort_.Open()
  57.    End Sub
  58.  
  59. #End Region
  60.  
  61. #Region "Event-Handlers"
  62.  
  63.    <DebuggerStepperBoundary>
  64.    Private Sub TimerSensores_Elapsed(sender As Object, e As ElapsedEventArgs) Handles TimerSensores.Elapsed
  65.        Me.SerialPort.Write("#03A" & ControlChars.Cr)
  66.        Me.SerialPort.DiscardInBuffer()
  67.  
  68.        Me.output_ = Me.SerialPort.ReadTo(ControlChars.Cr)
  69.  
  70.        DirectCast(sender, Timer).Interval += 1000
  71.    End Sub
  72.  
  73. #End Region
  74.  
  75. #Region "IDisposable Implementation"
  76.  
  77.    Private disposedValue As Boolean ' Flag to detect redundant calls
  78.  
  79.    <DebuggerStepThrough>
  80.    Public Sub Dispose() Implements IDisposable.Dispose
  81.        Me.Dispose(disposing:=True)
  82.    End Sub
  83.  
  84.    <DebuggerStepThrough>
  85.    Private Sub Dispose(disposing As Boolean)
  86.        If Not (Me.disposedValue) AndAlso (disposing) Then
  87.            Me.TimerSensores?.Dispose()
  88.            Me.serialPort_?.Dispose()
  89.        End If
  90.  
  91.        Me.disposedValue = True
  92.    End Sub
  93.  
  94. #End Region
  95.  
  96. End Class

Form1.vb
Código
  1. Public Class Form1
  2.  
  3.    Private sensorClass As SensorClass
  4.    Private canal0_nd03, canal1_nd03, canal2_nd03, canal3_nd03, canal4_nd03, canal5_nd03, canal6_nd03, canal7_nd03 As String
  5.  
  6.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  7.        Me.sensorClass = New SensorClass()
  8.  
  9.        With Me.Timer1
  10.            .Interval = 100
  11.            .Enabled = True
  12.            .Start()
  13.        End With
  14.    End Sub
  15.  
  16.    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
  17.  
  18.        Dim output As String = SensorClass.Output
  19.        Me.canal0_nd03 = output.Substring(3, 4)
  20.        Me.canal1_nd03 = output.Substring(10, 4)
  21.        Me.canal2_nd03 = output.Substring(17, 4)
  22.        Me.canal3_nd03 = output.Substring(24, 4)
  23.        Me.canal4_nd03 = output.Substring(31, 4)
  24.        Me.canal5_nd03 = output.Substring(38, 4)
  25.        Me.canal6_nd03 = output.Substring(44, 4)
  26.        Me.canal7_nd03 = output.Substring(52, 4)
  27.  
  28.        'MOSTRAR DATOS
  29.        Me.Label2.Text = $"{Me.canal0_nd03} ºC"
  30.        Me.Label6.Text = $"{Me.canal1_nd03} ºC"
  31.        Me.Label10.Text = $"{Me.canal2_nd03} ºC"
  32.        Me.Label7.Text = $"{Me.canal3_nd03} ºC"
  33.        Me.Label14.Text = $"{Me.canal4_nd03} ºC"
  34.        Me.Label11.Text = $"{Me.canal5_nd03} ºC"
  35.        Me.Label18.Text = $"{Me.canal6_nd03} ºC"
  36.        Me.Label15.Text = $"{Me.canal7_nd03} ºC"
  37.  
  38.        '' Si tienes problemas para actualizar el texto de los Labels,
  39.        '' desactiva alguna de las siguientes lineas comentadas para invocar el método de dibujado.
  40.        '
  41.        ' Me.Invalidate(invalidateChildren:=True)
  42.        ' Me.Refresh()
  43.  
  44.    End Sub
  45.  
  46. End Class

PD: No puedo comprobar si el código funciona como debería fucnionar, ya que carezco de ese dispositivo que estás utilizando, pero en teoría debería funcionar correctamente. Aparte, no entiendo muy bien por que en el método OnTimer incrementas el intervalo del timer en 1 segundo cada vez que hace tick, pero lo he dejado tal cual en el método TimerSensores_Elapsed.

Saludos.
418  Programación / .NET (C#, VB.NET, ASP) / Re: Buscar y contar numeros repetidos en distintos ListView en: 9 Agosto 2019, 12:35 pm
Puedes utilizar LINQ de la siguiente manera para simplificar el uso de varios búcles/For. De todas formas, todo resultaría más dinámico si en lugar de un ListView adaptases tu código para utilizar un DataGridView enlazando datos de origen en la propiedad DataGridView.DataSource.



Código
  1. Public Class Form1
  2.  
  3.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  4.  
  5.        Dim columnIndex As Integer = 0
  6.  
  7.        ' Unión entre las colecciones de elementos de ListView1, ListView2 y ListView3.
  8.        Dim items As ListViewItem() =
  9.            ({Me.ListView1.Items.Cast(Of ListViewItem),
  10.              Me.ListView2.Items.Cast(Of ListViewItem),
  11.              Me.ListView3.Items.Cast(Of ListViewItem)
  12.             }.SelectMany(Function(sequence) sequence)
  13.            ).ToArray()
  14.  
  15.        ' Agrupación de los elementos mediante pares de clave-valor (clave=texto del elemento, valor=cantidad de repeticiones).
  16.        Dim groups As KeyValuePair(Of String, Integer)() =
  17.            (From item As ListViewItem In items
  18.             Let key As String = item.SubItems(columnIndex).Text
  19.             Order By key Ascending
  20.             Group By key Into keys = Group
  21.             Select New KeyValuePair(Of String, Integer)(key, keys.Count())
  22.            ).ToArray()
  23.  
  24.        ' Creación de nuevos elementos para añadir en el ListView4.
  25.        Dim newItems As ListViewItem() =
  26.            (From group As KeyValuePair(Of String, Integer) In groups
  27.             Select New ListViewItem({group.Key, CStr(group.Value)})
  28.            ).ToArray()
  29.  
  30.        ' Adición de los nuevos elementos al ListView4.
  31.        With Me.ListView4
  32.            .BeginUpdate()
  33.  
  34.            .Items.Clear()
  35.            .Items.AddRange(newItems)
  36.  
  37.            .EndUpdate()
  38.        End With
  39.  
  40.    End Sub
  41.  
  42. End Class

Nótese que en la linea nº 21 del código de arriba, si lo prefieres puedes cambiar el tipo de retorno para devolver un array del tipo ListViewItem directamente.

Saludos.
419  Foros Generales / Foro Libre / Re: Opinión de experto: ¿comprar este dominio .com, o .net? en: 8 Agosto 2019, 20:08 pm
si tuviera que registrar y proteger una marca hoy en día yo empezaría por encontrar un dominio que está disponible en la mayor cantidad de TLDs.

Gracias por tu opinión.

En esto opino lo mismo que tu, logicamente me gustaría poder adquirir el dominio con más cantidad de dominios de nivel superior o TLDs disponibles, pero empezando por que el dominio .com sea el principal que debe estar disponible. Los demás dominios disponibles serán valiosos, pero tendrán una importancia secundaria para mi. ¿Crees que me equivoco al pensar de esta manera?, lee aquí abajo y entenderás por que pienso así...

Es super común que las personas no se acuerden del TLD, ¿Quieres que tus usuarios entren a tudominio.com, cuando tu dominio es tudominio.net? Yo tuve este mismo problema con el foro hace 15 años o más. Siempre acababa en SPAM(3) y luego esa persona se compro elhacker.org.

Precisamente el otro dia quise entrar a Mega para borrar archivos, pero no recordaba el dominio de Mega, y entonces me puse a buscarlo en Google tal cual: "Mega". Tras un intento fallido, empecé a buscar por "Mega.biz", "Mega.zn", "Mega cloud" y términos parecidos, incluso busqué por el antiguo nombre "Megaupload" a ver si por fin me salía la maldita página que yo estaba buscando, pero seguía sin salirme en la primera página de resultados de Google, y recuerdo que eso me hartó MUCHÍSIMO, y me molesté profundamente (con Google, no con Mega), y al final tuve que hacer máyor esfuerzo para encontrar la url correcta en el artículo de Mega en la Wikipedia. En fin, me tiré aprox. entre 2-5 minutos para encontrar la maldita página a pesar de que yo conocía el nombre, pero no me acordaba del TLD, y eso no me gustó NADA. Otras personas habrían desistido al primer o segundo intento y habrían pospuesto la búsqueda "para otro día", estoy seguro.

Si el dominio hubiese sido .com, este problema no me habría sucedido, por ser .com el más común y habitual como ya todos sabemos, y Mega habría obtenido mi visita y mi actividad de usuario en menor tiempo. Creo que los detalles que parecen así de insignificantes son los que mayor importancia tienen a la hora de elegir el dominio .com o .net (u otros).

A todo esto, ¿quien alguna vez en sus inicios no ha entrado por error al "hermano gemelo" de elhacker.net al escribir .com en su lugar, y escribir un guión donde no lo hay?. Es bastante incomodo y confuso cometer ese tipo de errores para terminar accediendo a una página la cual no tenías realmente intención de visitar...

El problema es que todos los buenos nombres con dominio .com ya están pillados por otras compañías, o están siendo revendidos. Por esos motivos tengo tantas dudas.



A mi el marketing se me da muy bien porque una de mis primeras actividades fue el diseño gráfico, diseño de banners, logotipos, y las típicas frases con gancho. Yo uso nombres que llamen la atención por no estar relacionados con lo que se ofrece en el sitio y creo una relación imaginaria basándome en el factor psicológico de como funciona la memoria al enlazar conceptos para recordarlos. Cortos de una sola palabra, con gancho, que suenen bien en varios idiomas y que se recuerden. Hay un montón libres por el estilo, si le hechas inaginación puedes crear un gran impacto y relacionar 2 términos que absolutamente no tienen nada que ver. Por ejemplo está sin comprar fideo.com
Puedes usar la imaginación y diseñar un logotipo de un rayo (por lo de elektro) con un fideo. Entonces todo tendrá "sentido". Parecerá curiosa la asociación para el cliente y recordará el dominio.
Los usuarios van a acceder por primera vez a traves de algún enlace en otro sitio. Todo se basa en que si el sitio les gusta y van a volver a acceder, que puedan entrar de la forma más rápida y sencilla. Esto mejora la valoración y la imagen que se crea en el usuario. Incoscientemente se piensa, que bien va este sitio. Aunque no tenga nada que ver.

No se. Yo no he estudiado esas materias pero es la primera vez que escucho algo semejante; en la mayoría de los videos que he visto por Internet de gente emprendedora que da consejos (ej. el canal de youtube aprendeemprendiendo), creo haber escuchado que es muy importante que el cliente se haga una idea mental de que trata el negocio solo con leer el nombre de la marca, o en este caso con leer la url. Creo que es un razonamiento lógico, por que si un posible cliente lee "fideo,com", se hará expectativas de encontrar algo relacionado con fideos al hacer click, y cuando vea que no es así se podría molestar y no interesarse ni un segundo más en ver de que trata tu negocio, ya que habrás captado su atención en vano y le habrás confundido y quizás decepcionado...

No pongo en duda que como estrategia pueda estar bien para que la gente asocie algo "random" a tu marca, si, como por ejemplo la marca 'Apple', que a pesar de llamarse como una fruta, vende las cosas que vende, pero yo creo que son casos muy excepcionales donde para empezar el comerciante ha iniciado su empresa ofrecido un producto innovador y de mucho valor para el consumidor, y seguidamente la suerte del marketing con millones $$$ de inversión ha estado mucho de su lado a pesar de llevar el nombre de una manzana. Pero para casos más normales, donde uno sabe que no va a innovar, no le encuentro sentido de por que debería seguir una estrageia para que la gente asocie algo "random" con mi negocio, en vez de hacer lo posible para que asocien algo que realmente esté relacionado con dicho negocio, ¿no sería esto mucho más eficiente?. No se, hablando desde mi completa inexperiencia en el marketing digital, a mi me parece algo arriesgado además de innecesario el usar un nombre que no esté relacionado con los productos/servicios que ofrece tu negocio.

Mira, el otro día entré a la página https://codefit.biz/, yo pensé que tendría algo que ver con la informática (por lo de code), pero me sorprendí bastante al ver que se trata de una tienda de ropa deportiva de fitness. Lo veo una gilipollez el nombre para ese tipo de compañía, sinceramente. :S Entiendo que lo de "fit" se refiere a fitness, ¿pero y lo de "code"?, en fin. Me acordaré de esa tienda por el nombre, si, pero no en el buen sentido...

De todas formas por supuesto tendré en cuenta tu opinión, ya que como dije, yo no he estudiado esas cosas y puedo estar errando en mi forma de pensar, y lo consultaré con ciertas personas del sector del marketing digital para poder obtener una segunda opinión.

Saludos.
420  Programación / .NET (C#, VB.NET, ASP) / Re: Comparar eventos de teclado con strings (C#) en: 8 Agosto 2019, 17:39 pm
Me gustaría llamar al método Form1_KeyPress() desde el método btnIniciar_Click(), no entiendo como podría pasar los argumentos (creo que se les denomina de ¨Control¨) desde ese punto.

Hacer eso carecería de sentido, puesto que estarías llamando a un controlador de evento (método Form1_KeyPress) con datos de evento (clase KeyPressEventArgs) artificiales. Dicho de otra forma, estarías simulando una pulsación del teclado artificial en el Form, y no creo que realmente desees hacer eso...

Supongo que la solución sería parecida para implementar los métodos del Timer.

En realidad, la solución óptima y sofisticada sería utilizar la clase/componente BackgroundWorker para aplicar el método de invocación asincrónica en los controles de la interfaz de usuario. Pero como te veo con poca experiencia, y como tampoco se si esto que pides es para un trabajo de clase donde te pidan aplicar cosas más basicas, pues aquí tienes un ejemplo donde utilizo prácticas más básicas:



Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Diagnostics;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Threading;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApp1 {
  11.  
  12.    public partial class Form1 : Form {
  13.  
  14.        private Random RNG = new Random(Environment.TickCount);
  15.  
  16.        private char nextChar;
  17.  
  18.        private bool isSuccess;
  19.        private int successCount;
  20.        private int failCount;
  21.  
  22.        public Form1() {
  23.           this.InitializeComponent();
  24.        }
  25.  
  26.        private void Form1_Load(object sender, EventArgs e) {
  27.            this.KeyPreview = true;
  28.        }
  29.  
  30.        private void btnIniciar_Click(object sender, EventArgs e) {
  31.  
  32.            this.Reset();
  33.  
  34.            Stopwatch watch = new Stopwatch();
  35.            watch.Start();
  36.  
  37.            while (watch.Elapsed <= TimeSpan.FromSeconds(3)) {
  38.                this.nextChar = this.GeneradorLetra("ABCDEFG".ToCharArray(), this.nextChar);
  39.                this.lblEtiqueta.Text = this.nextChar.ToString();
  40.  
  41.                while (!((this.isSuccess) || (watch.Elapsed >= TimeSpan.FromSeconds(3)))) {
  42.                    this.LabelStopWatch.Text = (3 - watch.Elapsed.Seconds).ToString();
  43.                    Application.DoEvents();
  44.                }
  45.  
  46.                if (this.isSuccess) {
  47.                    Thread.Sleep(500);
  48.                    this.successCount += 1;
  49.                } else {
  50.                    this.failCount += 1;
  51.                }
  52.                this.isSuccess = false;
  53.  
  54.                this.lblEtiqueta.ForeColor = Label.DefaultForeColor;
  55.                this.LabelSuccessful.Text = this.successCount.ToString();
  56.                this.LabelFailed.Text = this.failCount.ToString();
  57.  
  58.                watch.Restart();
  59.                Thread.CurrentThread.Join(0);
  60.            }
  61.  
  62.        }
  63.  
  64.        private void Form1_KeyPress(object sender, KeyPressEventArgs e) {
  65.  
  66.            if (!(this.isSuccess) && (char.ToLower(this.nextChar) == char.ToLower(e.KeyChar))) {
  67.                this.lblEtiqueta.ForeColor = Color.Green;
  68.                this.isSuccess = true;
  69.  
  70.            } else {
  71.                this.lblEtiqueta.ForeColor = Color.Red;
  72.  
  73.            }
  74.  
  75.        }
  76.  
  77.        private char GeneradorLetra(char[] charSet, char previousChar) {
  78.            IEnumerable<char> tmpCol = from char c in charSet
  79.                                       where (c != previousChar)
  80.                                       select c;
  81.            return tmpCol.ElementAtOrDefault(this.RNG.Next(0, tmpCol.Count()));
  82.        }
  83.  
  84.        private void Reset() {
  85.            this.successCount = 0;
  86.            this.failCount = 0;
  87.            this.LabelSuccessful.Text = this.successCount.ToString();
  88.            this.LabelFailed.Text = this.failCount.ToString();
  89.        }
  90.  
  91.    }
  92. }
  93.  

Código original escrito en VB.NET:
Código
  1. Imports System.Threading
  2.  
  3. Public Class Form1
  4.  
  5.    Private RNG As New Random(Environment.TickCount)
  6.  
  7.    Private nextChar As Char
  8.  
  9.    Private isSuccess As Boolean
  10.    Private successCount As Integer
  11.    Private failCount As Integer
  12.  
  13.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  14.        Me.KeyPreview = True
  15.    End Sub
  16.  
  17.    Private Sub btnIniciar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnIniciar.Click
  18.  
  19.        Me.Reset()
  20.  
  21.        Dim watch As New Stopwatch()
  22.        watch.Start()
  23.  
  24.        Do While (watch.Elapsed <= TimeSpan.FromSeconds(3))
  25.            Me.nextChar = Me.GeneradorLetra("ABCDEFG".ToCharArray(), Me.nextChar)
  26.            Me.lblEtiqueta.Text = Me.nextChar
  27.  
  28.            Do Until (Me.isSuccess) OrElse (watch.Elapsed >= TimeSpan.FromSeconds(3))
  29.                Me.LabelStopWatch.Text = CStr(3 - watch.Elapsed.Seconds)
  30.                Application.DoEvents()
  31.            Loop
  32.  
  33.            If (Me.isSuccess) Then
  34.                Thread.Sleep(500)
  35.                Me.successCount += 1
  36.            Else
  37.                Me.failCount += 1
  38.            End If
  39.            Me.isSuccess = False
  40.  
  41.            Me.lblEtiqueta.ForeColor = Label.DefaultForeColor
  42.            Me.LabelSuccessful.Text = CStr(Me.successCount)
  43.            Me.LabelFailed.Text = CStr(Me.failCount)
  44.  
  45.            watch.Restart()
  46.            Thread.CurrentThread.Join(0)
  47.        Loop
  48.  
  49.    End Sub
  50.  
  51.    Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles Me.KeyPress
  52.  
  53.        If Not (Me.isSuccess) AndAlso (Char.ToLower(Me.nextChar) = Char.ToLower(e.KeyChar)) Then
  54.            Me.lblEtiqueta.ForeColor = Color.Green
  55.            Me.isSuccess = True
  56.  
  57.        Else
  58.            Me.lblEtiqueta.ForeColor = Color.Red
  59.  
  60.        End If
  61.  
  62.    End Sub
  63.  
  64.    Private Function GeneradorLetra(charSet As Char(), previousChar As Char) As Char
  65.        Dim tmpCol As IEnumerable(Of Char) = From c As Char In charSet Where (c <> previousChar)
  66.        Return tmpCol(Me.RNG.Next(0, tmpCol.Count))
  67.    End Function
  68.  
  69.    Private Sub Reset()
  70.  
  71.        Me.successCount = 0
  72.        Me.failCount = 0
  73.        Me.LabelSuccessful.Text = CStr(Me.successCount)
  74.        Me.LabelFailed.Text = CStr(Me.failCount)
  75.  
  76.    End Sub
  77.  
  78. End Class

Puedes trasladar parte del código a un Timer si lo prefieres para evitar el búcle o llamada bloqueante junto a la llamada Application.DoEvents(), pero para ponerte a usar un Timer sería más eficiente que apliques el uso de la clase BackgroundWorker como ya mencioné.

Caracterísiticas del código/programa de arriba:
- Cuando el usuario presiona la tecla que imprime el caracter correcto, se visualiza en verde durante 500 ms y seguidamente se muestra el siguiente caracter.
- Se considera un fallo solamente si la cuenta atrás llega a 0 sin que el usuario haya conseguido presionar la tecla que imprime el caracter correcto, indiferentemente de la cantidad de fallos que el usuario haya tenido durante la cuenta atrás. Dicho de otra forma, se permiten fallos "infinitos" de pulsación de tecla durante la cuenta atrás.
- La aleatoriedad de muestra de caracteres consiste en que el caracter actual nunca se repetirá en la siguiente "prueba", pero si que podrá volver a mostrarse en las "pruebas" posteriores a esta.

Todo esto es así, por que tampoco especificaste como se supone que debe funcionar exactamente el programa. Pero ya con ese código puedes modificarlo para tus requisitos.

Saludos.
Páginas: 1 ... 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [42] 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 ... 1236
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines