Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#4241
Lo has entendido todo a la perfección y lo has sabido adaptar al código sin aydua :).

Solo que, aquí, no se si lo has entendido del todo, yo creo que deberías averiguar el día/semana que haya seleccionado en tu control DateTimePicker, y usarlo en el rango, por que esta función lo que hace es devolver un rango de valores desde X hasta Y: Enumerable.Range(desde_primer_dia_X, hasta_último_dia_Y):

Código (vbnet) [Seleccionar]
Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories(dateDir, Me.year, monthNumber, Enumerable.Range(1, semana))

Si solo quieres seleccionar la primera semana, deberías utilizarlo así Enumerable.Range(1, 7)

Auqnue bueno, eso es como tú lo quieras hacer.

Saludos!
#4242
Windows / Re: LETREROS FASTIDIOSOS !
9 Noviembre 2015, 19:36 PM
Cita de: marmolito en  9 Noviembre 2015, 19:11 PMMás seguro que los hagas funcionar mínimo un par de veces cada uno.

Adwcleaner, JunkWare, MalwareBytes...son buenas opciones.

Añado: Y desinstalarlos en seguida, justo despues de haberlos utilizado, por el elevado consumo de memoria (y recursos) que provocaría al ya excesivo consumo de memoria que existe en el equipo en cuestión.

No conviene mantener un software antiviral en segundo plano chupando recursos en el estado de ese PC, al menos, a simple vista, sin saber la causa del consumo, si se debe a limitaciones naturales de hardware, un uso indebido por parte del usuario/a, o software malicioso que lo esté causando.




1. Descarga cualquier buen antivirus, y realiza un escaneo profundo/exhaustivo.

2. Haz una limpieza general tanto de archivos como de claves del registro, con el programa CCLEANER (no te recomiendo utilizar otro software para limpiar el registro, existe cierto nivel de peligro con otros programas que no sean el que he mencionado).

3. Con cualquier administrador de tareas, yo te recomiendo Anvir Task Manager o AutoRuns, haz un análisis a ojo de los programas y servicios que se inician junto a windows, y desactiva los que no necesites.
De esta forma deberías poder localizar el proceso que causa el mensaje de la primera imagen, si te sucede siempre al iniciar sesión en Windows significa que o bien existe un acceso directo y/o entrada en el registro de inicio de aplicaciones (run) hacia el proceso RunDll32.exe, o bien otro programa diferente que se inicia junto a windows y hace una lamada a RunDll32.exe. Y en caso de que sea un virus, pues ya lo habrás desinfectado/eliminado con las indicaciones que te dieron arriba.

4. NO ABUSES DE LAS MAYÚSCULAS, SE CONSIDERA GRITAR! :P

Saludos
#4243
Cita de: Darux en  9 Noviembre 2015, 16:58 PMque trabaje con CMD (No se si soy muy especifico), lo que quiero decir, es que no es una aplicacion con diseño, sino que al abrir el archivo .exe, se abra una ventana CMD

La definición que buscas es CLI, o Command-Line Interface (Interfáz por linea de comandos).




Cita de: Darux en  9 Noviembre 2015, 16:58 PMno se en que tipo de lenguaje esta (Si es C, C++, ya que no se a que se refiere con C#) y hay varias cosas que no entiendo y varias que hay que sacar.

No es C ni tampoco C++ ni Visual C++ (VC++), el lenguaje en el que está escrito ese código fuente es C#, también conocido como C-Sharp (por la rejilla #), el cual forma parte de los lenguajes soportados por la plataforma .Net.

Para desarrollar bajo dicho lenguaje, necesitarás una IDE como Visual Studio, habiendo otras alternativas menos importantes e ineficientes que no voy a mencionar.




Cita de: Darux en  9 Noviembre 2015, 16:58 PMsacar toda la parte de la rcon que no me interesa en el programa y ponerle la funcion que cada contraseña que "Escriba", la copie al clipboard y la pegue en otra aplicacion o juego.

No puedes hacer eso tan a la ligera. Ese código fuente está ideado para utilizar sockets como método de ataque, por ende, primero debes confirmar si puedes comunicarte mediante sockets con la aplicación a la que deseas lanzar un ataque brute-force.

Hay otras técnicas IPC (Inter-process communication) para comunicarse con otra APP, como por ejemplo los espacios de asignación de memoria compartida, o el framework de automación de .Net ( conocido como Windows UI Automation ), o lo que sería un equivalente minimalista recuerriendo a unas simples llamadas a la API de Windows para asignarle texto a un control mediante la función SendMessage y enviando el mensaje de ventana WM_SETTEXT, lo que sería la opción más corriente y viable para todo tipo de escenarios.




Cita de: Darux en  9 Noviembre 2015, 16:58 PMEl fin de hacer esto, es hackear contraseñas de un juego (Si, parezco idiota buscando esto, pero de paso aprendo a programar).

El fin no justifica los medios. Así no se aprende a programar, copiando un código aleatorio el cual ni siquiera comprendes en que lenguaje está escrito.

Si quieres aprender a programar, entonces aprende de la manera habitual, y haciéndolo de esta forma, en un punto determinado del aprendizaje llegarás a tener un nivel de conocimiento adecuado para plantearte el desarrollo de este tipo de cosas.

Aquí te podemos ayudar a aprender, pero aquí no te vamos a ayudar a conseguir "hackear cuentas", ya que hay unas reglas en el foro, las cuales deben ser respetadas, y en una de esas reglas se prohibe por completo proporcionar ayuda a cualquier tema no ético o ilegal, como es el caso.

De todas formas, te diré que si pretendes desarrollar un algoritmo brute-force yo no tomaría ese código en C# como ejemplo, como una especie de plantilla o "guía" para principiantes, ya que me llevaría a malas prácticas de programación.
Te aconsejo aprender lo básico de programación, y luego, leer y practicar el asincronismo, el paralelismo y multi-threading en .Net, lo que te llevará a desarrollar algoritmos optimizados, ya que un algoritmo de fuerza bruta debe estar minimamente optimizado.

Tema cerrado

Saludos!
#4244
Cita de: elqueteconte en  9 Noviembre 2015, 17:17 PMQuiero tambien disculparme si he cometido alguna falta al mencionar que la función la habias hecho tu, pero me pareció poco etico y profesional que yo me atribuyera algo que no me pertenece, sería un plagio.

No xD, para nada, todo lo contrario, solo que el código estaba un poco ""feo"" y yo soy muy "tiquismiquis" para ciertas cosas.

Sobre lo demás, te comentaré en privado.

Saludos!
#4245
Cita de: elqueteconte en  9 Noviembre 2015, 14:50 PMEsta función fue desarrollada por Elektro y aquí se las comparto.

Que conste que agradezco cualquier mención hacia mi persona como autor de algo, sin embargo, no quiero que se me asocie con malos hábitos de programación, en el código hay una gran ausencia de indentación, ya que lo has modificado bastante, los comentarios abusivos (y en español, cosa que lo hice para el caso) y el desorden en general que hay montado en ese bloque de código xD.




Ese método está quedando excesivamente grande. Cuanto más grande o complejo sea un método más complejo será también para el compiler/intérprete (complejidad ciclomática).

Vamos a separar el trabajo en varios métodos, primero una función para obtener los directorios, segundo un overload de esa función para poder especificar un rango de días, y por último un método para mover los directorios obtenidos.

y... voilà:

Código (vbnet) [Seleccionar]
   <DebuggerStepThrough>
   Public Iterator Function SelectDirectories(ByVal sourceDir As String,
                                              ByVal year As Integer,
                                              ByVal month As Integer,
                                              ByVal days As IEnumerable(Of Integer),
                                              ByVal dateFormat As String) As IEnumerable(Of DirectoryInfo)

       If (CStr(year).Length <> 4) Then
           Throw New ArgumentOutOfRangeException(paramName:="year",
                                                 actualvalue:=year,
                                                 message:="A value of 4 digits is required.")

       ElseIf (month < 1) OrElse (month > 12) Then
           Throw New ArgumentOutOfRangeException(paramName:="month",
                                                 actualvalue:=month,
                                                 message:="A value from range '1' to '12' is required.")

       ElseIf (dateFormat.Replace("y", "").
                          Replace("M", "").
                          Replace("d", "").Length <> 0) Then

           Throw New NotImplementedException(
               message:="Specified date format is not implemented, only 'yyyy', 'MM' and 'dd' are interchangeable.")

       ElseIf Not Directory.Exists(sourceDir) Then
           Throw New DirectoryNotFoundException(
               message:=String.Format("Source directory not found: '{0}'", sourceDir))

       End If

       Dim sourceDirInfo As New DirectoryInfo(sourceDir)

       ' Obtengo una colección con los nombres de directorio con el formato de fecha especificado.
       ' (ej. de Octubre 2015:  20151001 ... 20151031)
       Dim dateDirNames As IEnumerable(Of String) =
           From day As Integer In days
           Select dateFormat.Replace("yyyy", CStr(year)).
                             Replace("MM", CStr(month).PadLeft(2, "0"c)).
                             Replace("dd", CStr(day).PadLeft(2, "0"c))

       ' Itero y devuelvo una colección con las rutas absolutas de los directorios que cumplen los requisitos.
       For Each dirInfo As DirectoryInfo In sourceDirInfo.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)

           If dateDirNames.Contains(dirInfo.Name) Then
               Yield dirInfo
           End If

       Next

   End Function

   <DebuggerStepThrough>
   Public Function SelectDirectories(ByVal sourceDir As String,
                                     ByVal year As Integer,
                                     ByVal month As Integer,
                                     ByVal dateFormat As String) As IEnumerable(Of DirectoryInfo)

       Dim days As IEnumerable(Of Integer) = Enumerable.Range(1, DateTime.DaysInMonth(year, month))

       Return SelectDirectories(sourceDir, year, month, days, dateFormat)

   End Function

   <DebuggerStepThrough>
   Public Sub MoveDirectories(ByVal directories As IEnumerable(Of DirectoryInfo),
                              ByVal targetDir As String)

       If Not Directory.Exists(targetDir) Then
           Throw New DirectoryNotFoundException(
               message:=String.Format("Target directory not found: '{0}'", targetDir))

       Else
           Dim trgDirInfo As New DirectoryInfo(targetDir)

           For Each srcDirInfo As DirectoryInfo In directories

               If Not Directory.Exists(srcDirInfo.FullName) Then
                   Throw New DirectoryNotFoundException(
                       message:=String.Format("Source directory not found: '{0}'", srcDirInfo.FullName))
               Else
                   Debug.WriteLine(String.Format("Moviendo: {0}", srcDirInfo.FullName))
                   srcDirInfo.MoveTo(Path.Combine(trgDirInfo.FullName, srcDirInfo.Name))

               End If

           Next

       End If

   End Sub


PD: Lo he escrito al vuelo, no lo he testeado, ya no conservo la estructura de carpetas para testearlo, pero creo que no hay ninguna fisura en el código.




Ejemplo de uso:

Seleccionar las carpetas del mes entero:
Código (vbnet) [Seleccionar]
Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories("C:\Directorio\", 2015, 11, "formato de fecha")

o de un rango de días (del día 1 al 15):
Código (vbnet) [Seleccionar]
Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories("C:\Directorio\", 2015, 11, Enumerable.Range(1, 15), "formato de fecha")

o de ciertos dias:
Código (vbnet) [Seleccionar]
Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories("C:\Directorio\", 2015, 11, {5, 3, 9, 12}, "formato de fecha")

y por último, mover los directorios:
Código (vbnet) [Seleccionar]
MoveDirectories(directories, "C:\Destino\")

Saludos
#4246
He ideado esta sencilla y genérica manera de reunir en una misma función la posibilidad de utilizar varios algoritmos para computar el hash de un archivo o de un string.

Ejemplo de uso:

Código (vbnet) [Seleccionar]
Dim md5 As String = CryptoUtil.ComputeHashOfString(Of MD5CryptoServiceProvider)("Hello World!")
Dim sha1 As String = CryptoUtil.ComputeHashOfString(Of SHA1CryptoServiceProvider)("Hello World!")
Dim sha256 As String = CryptoUtil.ComputeHashOfString(Of SHA256CryptoServiceProvider)("Hello World!")
Dim sha384 As String = CryptoUtil.ComputeHashOfString(Of SHA384CryptoServiceProvider)("Hello World!")
Dim sha512 As String = CryptoUtil.ComputeHashOfString(Of SHA512CryptoServiceProvider)("Hello World!")


Código (vbnet) [Seleccionar]
Dim md5 As String = CryptoUtil.ComputeHashOfFile(Of MD5CryptoServiceProvider)("C:\File.ext")
Dim sha1 As String = CryptoUtil.ComputeHashOfFile(Of SHA1CryptoServiceProvider)("C:\File.ext")
Dim sha256 As String = CryptoUtil.ComputeHashOfFile(Of SHA256CryptoServiceProvider)("C:\File.ext")
Dim sha384 As String = CryptoUtil.ComputeHashOfFile(Of SHA384CryptoServiceProvider)("C:\File.ext")
Dim sha512 As String = CryptoUtil.ComputeHashOfFile(Of SHA512CryptoServiceProvider)("C:\File.ext")


Código fuente:
Código (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Computes the hash, using the given hash algorithm, for the specified string.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <example> This is a code example.
''' <code>
''' Dim md5 As String = CryptoUtil.ComputeHashOfString(Of MD5CryptoServiceProvider)("Hello World!")
''' Dim sha1 As String = CryptoUtil.ComputeHashOfString(Of SHA1CryptoServiceProvider)("Hello World!")
''' Dim sha256 As String = CryptoUtil.ComputeHashOfString(Of SHA256CryptoServiceProvider)("Hello World!")
''' Dim sha384 As String = CryptoUtil.ComputeHashOfString(Of SHA384CryptoServiceProvider)("Hello World!")
''' Dim sha512 As String = CryptoUtil.ComputeHashOfString(Of SHA512CryptoServiceProvider)("Hello World!")
''' </code>
''' </example>
''' ----------------------------------------------------------------------------------------------------
''' <typeparam name="T">
''' The <see cref="HashAlgorithm"/> provider.
''' </typeparam>
'''
''' <param name="str">
''' The string.
''' </param>
'''
''' <param name="enc">
''' The text <see cref="Encoding"/>.
''' </param>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' An Hexadecimal representation of the resulting hash value.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
Public Function ComputeHashOfString(Of T As HashAlgorithm)(ByVal str As String,
                                                          Optional ByVal enc As Encoding = Nothing) As String

   If (enc Is Nothing) Then
       enc = Encoding.Default
   End If

   Using algorithm As HashAlgorithm = DirectCast(Activator.CreateInstance(GetType(T)), HashAlgorithm)

       Dim data As Byte() = enc.GetBytes(str)
       Dim hash As Byte() = algorithm.ComputeHash(data)
       Dim sb As New StringBuilder(capacity:=hash.Length * 2)

       For Each b As Byte In hash
           sb.Append(b.ToString("X2"))
       Next

       Return sb.ToString

   End Using

End Function

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Computes the hash, using the given hash algorithm, for the specified file.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <example> This is a code example.
''' <code>
''' Dim md5 As String = CryptoUtil.ComputeHashOfFile(Of MD5CryptoServiceProvider)("C:\File.ext")
''' Dim sha1 As String = CryptoUtil.ComputeHashOfFile(Of SHA1CryptoServiceProvider)("C:\File.ext")
''' Dim sha256 As String = CryptoUtil.ComputeHashOfFile(Of SHA256CryptoServiceProvider)("C:\File.ext")
''' Dim sha384 As String = CryptoUtil.ComputeHashOfFile(Of SHA384CryptoServiceProvider)("C:\File.ext")
''' Dim sha512 As String = CryptoUtil.ComputeHashOfFile(Of SHA512CryptoServiceProvider)("C:\File.ext")
''' </code>
''' </example>
''' ----------------------------------------------------------------------------------------------------
''' <typeparam name="T">
''' The <see cref="HashAlgorithm"/> provider.
''' </typeparam>
'''
''' <param name="filepath">
''' The filepath.
''' </param>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' An Hexadecimal representation of the resulting hash value.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
Public Function ComputeHashOfFile(Of T As HashAlgorithm)(ByVal filepath As String) As String

   Using fs As New FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read)

       Using algorithm As HashAlgorithm = DirectCast(Activator.CreateInstance(GetType(T)), HashAlgorithm)

           Dim hash As Byte() = algorithm.ComputeHash(fs)
           Dim sb As New StringBuilder(capacity:=hash.Length * 2)

           For Each b As Byte In hash
               sb.Append(b.ToString("X2"))
           Next b

           Return sb.ToString

       End Using

   End Using

End Function
#4247
Cita de: A.I. en  9 Noviembre 2015, 10:50 AMUna pequeña matización, signed y unsigned en este contexto es con signo y sin signo, no firmado y sin firmar :-P. Aunque ésto viene más a cuento en el hilo de malas traducciones :-P

Gracias por la pequeña corrección. Mi traducción de algunos términos al Castellano a veces está al nivel de esto:

Saludos!
#4248
Multimedia / Re: Reducir peso del vídeo
9 Noviembre 2015, 09:28 AM
Vaya, Dimitrix, se me hace muy extraño leer un comentario tuyo sin mencionar mujeres de por medio!, no perdamos las buenas costumbres :xD.

Personalmente yo siempre recomiendo la aplicación StaxRip, la cual es una opción como otra cualquiera:



Como puedes comprobar en la imagen, es una aplicación bastante intuitiva, no es un programa grande o aparatoso (aunque está lleno de opciones o características), se le puede dar un uso básico o avanzado, dependiendo del usuario que lo utilice y con que finalidad, pero generalmente hablando considero que es una app sencilla de usar o de compreonder. Viene con algunos perfiles predefinidos, aunque lo suyo es que configures adecuadamente el encoder.

Primero te sugiero que averigues el bitrate de la pista de video del archivo original que grabaste, lo puedes averiguar de forma sencilla con la aplicación mediainfo-lite:

Una vez averiguado el bitrate de video, cargas el video en el programa StaxRip, seleccionas el perfil x264, y lo configuras manualmente para usar modo de codificación por bitrate en lugar de modo de codificación por calidad, asignarle una calidad alta, y asignarle un bitrate que sea un poco menor que el del video original. Creo que solo con eso obtendrías buenos resultados.

Fíjate en la imagen de arriba, la etiqueta azúl que pone "x264 quality mode", pues no codifiques el video usando modo de calidad, por que es muy básico y los resultados que puede dar varian mucho, hazlo en modo bitrate como dije. A cada etiqueta azúl le puedes pinchas para cambiar esa configuración en especifico.

EDITO: Te dejo algunas imágenes para guiarte un poco:

Como ves en esta imagen, puedes anticipar el tamaño final del archivo, según el bitrate que elijas (en conjunto con el resto de parámetros del encoder de video y audio).


Estas opciones son las más importantes, déjalas así, excepto el campo "Preset", dependiendo de la calidad que desees, cuanto más lento, mayor resultado en la calidad general:


Según el preset que elijas, alterará la configuración del encoder que puedes ver en esta imagen. Deberías elegir el algoritmo Multi-Hex como mínimo, para una calidad decente.
 

Configuración de audio ...normalita (¿pa que más?):


Saludos
#4249
Por favor, a los dos, usad las etiquetas GeShi para insertar bloques de código. Leed Las normas del foro de programación.

Cita de: PichusMR en  8 Noviembre 2015, 22:52 PMno se como hacerlo, ya tengo el timer

Empezamos mal asumiendo que todo se soluciona o se debe solucionar con un Timer :P. De todas formas, la solución al código que actualmente tienes sería comparar el valor actual del progreso, ProgressBar.Value, con el valor máximo, la propiedad ProgressBar.Maximum.

Código (csharp) [Seleccionar]
PB1.Increment(1);
blcarga.Text = PB1.Value.ToString() + "%";

if ((PB1.Value == PB1.Maximum)) {
MessageBox.Show("Progreso finalizado.", "", MessageBoxButtons.OK);
}





Yo optaría por heredar y extender la class ProgressBar para exponer un evento llamado ValueChanged que se dispare cuando el valor o posición de progreso cambie, y entonces comodamente podriamos suscribirnos a dicho evento.

Ejemplo de uso en Vb.Net:
Código (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Handles the <see cref="ProgressBarExtended.ValueChanged"/> event of the <see cref="ProgressBarExtended1"/> control.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <param name="sender">
''' The source of the event.
''' </param>
'''
''' <param name="e">
''' The <see cref="ProgressBarExtended.ValueChangedEventArgs"/> instance containing the event data.
''' </param>
''' ----------------------------------------------------------------------------------------------------
Private Sub ProgressBarExtended1_ValueChanged(sender As Object, e As ProgressBarExtended.ValueChangedEventArgs) _
Handles ProgressBarExtended1.ValueChanged

   Dim pb As ProgressBarExtended = DirectCast(sender, ProgressBarExtended)

   If (e.Value = pb.Maximum) Then
       MessageBox.Show("Progreso finalizado.", "", MessageBoxButtons.OK)
   End If

End Sub


Ejemplo de uso en C#:
Código (csharp) [Seleccionar]
/// ----------------------------------------------------------------------------------------------------
/// <summary>
/// Handles the <see cref="ProgressBarExtended.ValueChanged"/> event of the <see cref="ProgressBarExtended1"/> control.
/// </summary>
/// ----------------------------------------------------------------------------------------------------
/// <param name="sender">
/// The source of the event.
/// </param>
///
/// <param name="e">
/// The <see cref="ProgressBarExtended.ValueChangedEventArgs"/> instance containing the event data.
/// </param>
/// ----------------------------------------------------------------------------------------------------
private void ProgressBarExtended1_ValueChanged(object sender, ProgressBarExtended.ValueChangedEventArgs e) {

ProgressBarExtended pb = (ProgressBarExtended)sender;
if ((e.Value == pb.Maximum)) {
MessageBox.Show("Progreso finalizado.", "", MessageBoxButtons.OK);
}

}


Código fuente original en Vb.Net:
Código (vbnet) [Seleccionar]
#Region " Option Statements "

Option Strict On
Option Explicit On
Option Infer Off

#End Region

#Region " Imports "

Imports System
Imports System.Diagnostics
Imports System.Linq
Imports System.Windows.Forms

#End Region

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' An extended <see cref="ProgressBar"/>.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
Public Class ProgressBarExtended : Inherits ProgressBar

#Region " Events "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Occurs when the progress value changes.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   Public Custom Event ValueChanged As EventHandler(Of ValueChangedEventArgs)

       <DebuggerNonUserCode>
       <DebuggerStepThrough>
       AddHandler(ByVal value As EventHandler(Of ValueChangedEventArgs))
           MyBase.Events.AddHandler("ValueChangedEvent", value)
       End AddHandler

       <DebuggerNonUserCode>
       <DebuggerStepThrough>
       RemoveHandler(ByVal value As EventHandler(Of ValueChangedEventArgs))
           MyBase.Events.RemoveHandler("ValueChangedEvent", value)
       End RemoveHandler

       <DebuggerNonUserCode>
       <DebuggerStepThrough>
       RaiseEvent(ByVal sender As Object, ByVal e As ValueChangedEventArgs)
           Dim handler As EventHandler(Of ValueChangedEventArgs) =
               DirectCast(MyBase.Events("ValueChangedEvent"), EventHandler(Of ValueChangedEventArgs))

           If (handler IsNot Nothing) Then
               handler.Invoke(sender, e)
           End If
       End RaiseEvent

   End Event

#End Region

#Region " Events Data "

#Region " ValueChangedEventArgs "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Contains the event-data of a <see cref="ValueChanged"/> event.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   Public Class ValueChangedEventArgs : Inherits EventArgs

#Region " Properties "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Gets the value.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <value>
       ''' The value.
       ''' </value>
       ''' ----------------------------------------------------------------------------------------------------
       Public Overridable ReadOnly Property Value() As Integer
           <DebuggerStepThrough>
           Get
               Return Me.valueB
           End Get
       End Property
       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' ( Backing field )
       ''' The value.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Private ReadOnly valueB As Integer

#End Region

#Region " Constructors "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Prevents a default instance of the <see cref="ValueChangedEventArgs"/> class from being created.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerNonUserCode>
       Private Sub New()
       End Sub

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Initializes a new instance of the <see cref="ValueChangedEventArgs"/> class.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="value">
       ''' The value.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       Public Sub New(ByVal value As Integer)

           Me.valueB = value

       End Sub

#End Region

   End Class

#End Region

#End Region

#Region " Event Invocators "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Raises <see cref="ValueChanged"/> event.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="e">
   ''' The <see cref="ValueChangedEventArgs"/> instance containing the event data.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Protected Overridable Sub OnValueChanged(ByVal e As ValueChangedEventArgs)

       RaiseEvent ValueChanged(Me, e)

   End Sub

#End Region

#Region " Constructors "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Initializes a new instance of the <see cref="ProgressBarExtended"/> class.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Sub New()

       MyBase.New()

   End Sub

#End Region

#Region " Properties "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Gets or sets the current position of the progress bar.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <value>
   ''' The value.
   ''' </value>
   ''' ----------------------------------------------------------------------------------------------------
   Public Overridable Shadows Property Value As Integer
       <DebuggerStepThrough>
       Get
           Return MyBase.Value
       End Get
       <DebuggerStepThrough>
       Set(ByVal value As Integer)
           Dim oldValue As Integer = MyBase.Value
           MyBase.Value = value
           If (value <> oldValue) Then
               Me.OnValueChanged(New ValueChangedEventArgs(value))
           End If
       End Set
   End Property

#End Region

#Region " Public Methods "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Advances the current position of the progress bar by the specified amount.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="value">
   ''' The amount by which to increment the progress bar's current position.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Overridable Shadows Sub Increment(ByVal value As Integer)

       Dim oldValue As Integer = MyBase.Value
       MyBase.Increment(value)

       If (oldValue <> MyBase.Maximum) Then
           Me.OnValueChanged(New ValueChangedEventArgs(MyBase.Value))
       End If

   End Sub

#End Region

End Class


Código fuente traducido (online) a C#. no lo he testeado, pero requerirá pequeñas modificaciones en la sintaxis:
Código (csharp) [Seleccionar]
#region " Usings "

using System;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;

#endregion

/// ----------------------------------------------------------------------------------------------------
/// <summary>
/// An extended <see cref="ProgressBar"/>.
/// </summary>
/// ----------------------------------------------------------------------------------------------------
public class ProgressBarExtended : ProgressBar
{

   #region " Events "

   /// ----------------------------------------------------------------------------------------------------
   /// <summary>
   /// Occurs when the progress value changes.
   /// </summary>
   /// ----------------------------------------------------------------------------------------------------
   public event EventHandler<ValueChangedEventArgs> ValueChanged {

       [DebuggerNonUserCode()]
       [DebuggerStepThrough()]
       add { base.Events.AddHandler("ValueChangedEvent", Value); }

       [DebuggerNonUserCode()]
       [DebuggerStepThrough()]
       remove { base.Events.RemoveHandler("ValueChangedEvent", Value); }

   }
   #endregion

   #region " Events Data "

   #region " ValueChangedEventArgs "

   /// ----------------------------------------------------------------------------------------------------
   /// <summary>
   /// Contains the event-data of a <see cref="ValueChanged"/> event.
   /// </summary>
   /// ----------------------------------------------------------------------------------------------------
   public class ValueChangedEventArgs : EventArgs
   {

       #region " Properties "

       /// ----------------------------------------------------------------------------------------------------
       /// <summary>
       /// Gets the value.
       /// </summary>
       /// ----------------------------------------------------------------------------------------------------
       /// <value>
       /// The value.
       /// </value>
       /// ----------------------------------------------------------------------------------------------------
       public virtual int Value {
           [DebuggerStepThrough()]
           get { return this.valueB; }
       }

       /// ----------------------------------------------------------------------------------------------------
       /// <summary>
       /// ( Backing field )
       /// The value.
       /// </summary>
       /// ----------------------------------------------------------------------------------------------------
       private readonly int valueB;
       #endregion

       #region " Constructors "

       /// ----------------------------------------------------------------------------------------------------
       /// <summary>
       /// Prevents a default instance of the <see cref="ValueChangedEventArgs"/> class from being created.
       /// </summary>
       /// ----------------------------------------------------------------------------------------------------
       [DebuggerNonUserCode()]
       private ValueChangedEventArgs()
       {
       }

       /// ----------------------------------------------------------------------------------------------------
       /// <summary>
       /// Initializes a new instance of the <see cref="ValueChangedEventArgs"/> class.
       /// </summary>
       /// ----------------------------------------------------------------------------------------------------
       /// <param name="value">
       /// The value.
       /// </param>
       /// ----------------------------------------------------------------------------------------------------
       [DebuggerStepThrough()]
       public ValueChangedEventArgs(int value)
       {
           this.valueB = value;
       }

       #endregion

   }

   #endregion

   #endregion

   #region " Event Invocators "

   /// ----------------------------------------------------------------------------------------------------
   /// <summary>
   /// Raises <see cref="ValueChanged"/> event.
   /// </summary>
   /// ----------------------------------------------------------------------------------------------------
   /// <param name="e">
   /// The <see cref="ValueChangedEventArgs"/> instance containing the event data.
   /// </param>
   /// ----------------------------------------------------------------------------------------------------
   [DebuggerStepThrough()]
   protected virtual void OnValueChanged(ValueChangedEventArgs e)
   {
       if (ValueChanged != null) {
           ValueChanged(this, e);
       }
   }

   #endregion

   #region " Constructors "

   /// ----------------------------------------------------------------------------------------------------
   /// <summary>
   /// Initializes a new instance of the <see cref="ProgressBarExtended"/> class.
   /// </summary>
   /// ----------------------------------------------------------------------------------------------------
   [DebuggerStepThrough()]
   public ProgressBarExtended() : base()
   {}

   #endregion

   #region " Properties "

   /// ----------------------------------------------------------------------------------------------------
   /// <summary>
   /// Gets or sets the current position of the progress bar.
   /// </summary>
   /// ----------------------------------------------------------------------------------------------------
   /// <value>
   /// The value.
   /// </value>
   /// ----------------------------------------------------------------------------------------------------
   public virtual new int Value {
       [DebuggerStepThrough()]
       get { return base.Value; }
       [DebuggerStepThrough()]
       set {
           int oldValue = base.Value;
           base.Value = value;
           if ((value != oldValue)) {
               this.OnValueChanged(new ValueChangedEventArgs(value));
           }
       }
   }

   #endregion

   #region " Public Methods "

   /// ----------------------------------------------------------------------------------------------------
   /// <summary>
   /// Advances the current position of the progress bar by the specified amount.
   /// </summary>
   /// ----------------------------------------------------------------------------------------------------
   /// <param name="value">
   /// The amount by which to increment the progress bar's current position.
   /// </param>
   /// ----------------------------------------------------------------------------------------------------
   [DebuggerStepThrough()]
   public virtual new void Increment(int value)
   {
       int oldValue = base.Value;
       base.Increment(value);

       if ((oldValue != base.Maximum)) {
           this.OnValueChanged(new ValueChangedEventArgs(base.Value));
       }

   }

   #endregion

}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
#4250
...¿Quien decía que Facebook aportaba cosas buenas a la evolución del ser humano?.