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 - okik

#711
Windows / Re: Activar Windows XP
24 Marzo 2015, 19:39 PM
Cita de: guss_1976 en 11 Marzo 2015, 21:25 PM
dentro de esta ruta C:\WINDOWS\system32 tenes dos archivos wgalogon y wgatray estos dos cambiales la extension .dll a  extensión .exe de esa manera lo solucionas

Hola #guss_1976#

Gracias por la respuesta, pero con todos mis respetos te diré que tu solución es FALSA. ¿Pero tú realmente te crees que los de Microsoft son tontos y que cambiando la extensión de dos archiovs se activa windows? Esos archivos no tienen nada que ver con la activación, solo tienen que ver con que windows sea genuino o no. En cualquier caso es alrevés, tienen que estar.

Personalmente he testeado TODO lo que he encontrado en la red sobre como activar XP manualmente es falso y NINGUNO ha funcionado. Todo lo que encontréis en la red es FALSO.

Sin embargo, y a pesar de ello encontraréis foros en los que otros usuarios aplauden el supuesto "truco" y dicen "Great, work" (funciona) o "Gracias men, realmente funciona", y cosas por el estilo. Pero hay trampa, probablemente las personas que felicitaron lo hicieron inmediatamente sin comprobar, cambiando la fecha, si a los treinta días se bloqueaba el acceso al windows (una vez bloqueado si que es posible entrar en Modo seguro (Safe Mode)). Por ejemplo, un truco muy conocido y fácil de encontrar en la red consiste en modificar una clave del registro llamada OOBETimer  con el siguiente valor:
(TRUCO FALSO)

OOBETimer="FF D5 71 D6 8B 6A 8D 6F D5 33 93 FD

Por defecto:

OOBETimer="EB 54 8C C6 0E 45 17 59 55 5B F4 30"

Pues bien, este sistema lo que hace es simular la activación. De hecho, una vez modificada la clave del registro, cuando tratas de activarlo por el medio convencional que proporcionó Microsoft, ejecutando msoobe.exe, aparece un cuadro que te dice que Windows XP está activado. Pero es FALSO. A los 30 días aparece, al iniciar el sistema, la dichosa pantalla de activación y no te deja entrar, en modo normal, a no ser que lo actives.

Otro sistema es el que tu propones, también es FALSO. Lo de modificar la extensión wgatray.exe y wgalogon.dll. Estos dos archivos NO ESTÁN DISPONIBLES en Windows XP Home Premium cuando lo instalas en una PC  SIN CONEXIÓN A INTERNET). En Windows XP Profesional seguramente que tampoco. Y si no me equivoco, se crean en cuanto se activa por primera vez o actualizas el sistema, creo que incluso cuando simplemente tu sistema tiene acceso a la red. Estos archivos simplemente determinan que tu Windows es genuino, de ahí lo de WGA (Windows Genuine Advantage) y por lo tanto si lo es, Microsoft te ofrece el servicio de actualización y asistencia.

Hay que tener en cuenta que hay diferentes tipos de XP, unos adaptados para determinado portátil, también el Profesional y el Home Premium, además de las versiones SP1, SP2 Y SP3. Los tres son diferentes en algunas cosas.. Los de los portátiles están configurados para activarse automáticamente cuando el sistema tiene conexión a Internet siempre que dicho XP esté asociado a dicho portátil. Aunque también se pueden activar por teléfono.

Otro sistema que he encontrado es precisamente, todo lo contrario, consiste en instalar los archivos que tú dices que hay que cambiarles la extensión (lógicamente para que Windows no los encuentre). ¿En qué quedamos se borran o se instalan? Jajaja.





La tercera opción que encontré consiste en ejecutar el programa de activación msoobe.exe y realizar una serie de pasos que yo he seguido religiosamente y, como era de esperar, tampoco ha funcionado.

Algunos trucos comentados incluso se han unido en  metodología.  El engaño está en hacer lo del cambio en OOBETimer. El usuario "pardillo", se pondría supercontento cuando vio el mensaje de que Windows XP está activado, pero claro, es por haber modificado dicha clave, como he comentado antes. Pero se sentiría engañado y como un estúpido cuando al pasar los  30 días, no pudiera acceder al sistema.

Hay que ser tonto para pensar que un sistema manual que pueda "hackear" un producto de Microsoft pueda se expuesto en una Web como si nada, por la simple razón de que es ILEGAL. Pensar que puedes entrar en Google Search y buscar un método infalible, es de palurdos (y yo me incluyo).

Por supuesto no faltan esos programitas gratuítos que se anuncian en YouTube, que no digo que algunos no funcionen, claro que sí, pero de paso te dejan un regalito en tu compu. Algunos incluso esconden su regalito en el MBR.

Lejos está aquella época donde los primero hackers o crackers colgaban sus cracks para simplemente alardear de conocimiento y demostrar lo que podían hacer, aunque otros se limitaban a fastidiarte impidiendo que pudieras iniciar el sistema, bloqueándote la barra de tareas de Windows, informando mal del tamaño del disco, cargándose tus archivos,  y un sin fin de chorradas más. Ahora la moda es robar datos, estafar, espiarte y utilizar tu computadora para expandir su dominio en la red.


#712
Cita de: ElP4nd4N3gro en  4 Marzo 2015, 23:14 PM
jeje "él quería ser piloto, pero odiaba conducir"

Yo más bien diría que tú prefieres ir en coche y yo en moto o alrevés
#713
Programación Visual Basic / Re: Spy++
23 Marzo 2015, 14:44 PM
Hola

Por decucción, como has titulado el asunto como "Spy++", supongo que te refieres a la Calculadora de Windows accediendo a ella desde tu apliación.  En Spy++ al hacer clic en "+" correspondiente a la Calculadora se despliega un árbol donde aparecen todos los handles y textos de cada botón. De modo que cada botón tiene un Handle (un número aleatório identificativo) y una etiqueta o texto "1","2", "Bin","hyp", "=", etc.

Para recorrer los botones primero se obtiene el handle de la calculadora con la declaración API FindWindow, después el handle del PRIMER  botón con FindWindowEx, y para ir recorriendo los siguientes botones se usa GetWindow y el comando GW_HWNDNEXT.

Para saber si estás en un determinado botón obtienes su etiquieta o texto con GetWindowText, así si estás en "5" obtienes "5".



Aquí te dejo un plantilla de ejemplo,  que recorre todos los botones e introduce el nombre de cada uno en un ListBox. Además, al pasar el cursor por los botones de la calculadora muestra en un Label el botón donde se encuentra el cursor.

Necesitas un Botón, un Label , un ListBox y un control Timer


En un Form:
EN VB6
Código (vb) [Seleccionar]
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Const WM_SYSCOMMAND = &H112
Private Const SC_CLOSE = &HF060&

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long

Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPointXY Lib "user32" Alias "WindowFromPoint" _
(ByVal xPoint As Long, ByVal yPoint As Long) As Long

Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

'Para recorrer todos los botones
Private Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Private Const GW_CHILD = 5
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDLAST = 1
Private Const GW_HWNDNEXT = 2
Private Const GW_HWNDPREV = 3
Private Const GW_MAX = 5
Private Const GW_OWNER = 4

Private Sub Command1_Click()
Shell "Calc", vbNormalFocus
Timer1.Enabled = True
RecorrerBotones
End Sub

Public Function TextoBoton() As String
Dim pt32 As POINTAPI
Dim ptx As Long
Dim pty As Long
Dim x As Long
Dim hw As Long
Dim hWndParent As Long
Dim TextWindow As String * 100
Call GetCursorPos(pt32)                ' obtiene la posición del cursor
ptx = pt32.x
pty = pt32.y
   hw = WindowFromPointXY(ptx, pty) ' Obtiene el handle debajo del cursor
   hWndParent = GetParent(hw) ' Consigue el handle padre de una ventana
   x = GetWindowText(hWndParent, TextWindow, 100) 'Obtiene el texto de la ventana
If Left(TextWindow, x) = "Calculadora" Then
   x = GetWindowText(hw, TextWindow, 100) 'Obtiene el texto de un botón
   TextoBoton = Left(TextWindow, x)
End If

End Function

Private Sub Form_Load()
Timer1.Enabled = False
Command1.Caption = "Abrir calculadora"
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim hw As Long
hw = FindWindow("SciCalc", vbNullString)
SendMessage hw, WM_SYSCOMMAND, SC_CLOSE, &H0 'Cierra la calculadora
End
End Sub

Private Sub Timer1_Timer()
'Para obtener el texto del botón donde se encuentra el cursor
Label1.Caption = TextoBoton

Me.Caption = TextoBoton

End Sub

Public Sub RecorrerBotones()
Dim hw As Long
Dim x As Long
Dim TextWindow As String * 100
hw = FindWindow("SciCalc", vbNullString)
hw = FindWindowEx(hw, &H0, "Button", vbNullString) 'obtiene el primer handle de un botón
   Do While Left(TextWindow, x) <> "C "
       hw = GetWindow(hw, GW_HWNDNEXT) '<--- Esto permite obtener y pasar al siguiente Handle de la lista
       x = GetWindowText(hw, TextWindow, 100) 'Obtiene el texto de un botón
       If x > 0 Then
       List1.AddItem Left(TextWindow, x)
       End If
       DoEvents
   Loop
End Sub




EN VB.NET
Código (vbnet) [Seleccionar]
Imports VB = Microsoft.VisualBasic
Public Class Form1
   Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
       (ByVal hWnd As Integer, _
        ByVal wMsg As Integer, _
        ByVal wParam As Integer, _
        ByRef lParam As Object) As Integer

   Private Const WM_SYSCOMMAND = &H112
   Private Const SC_CLOSE = &HF060&


   Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Integer

   Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
   (ByVal hWnd1 As Integer, _
   ByVal hWnd2 As Integer, _
   ByVal lpsz1 As String, _
   ByVal lpsz2 As String) As Integer

   Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
   (ByVal hwnd As Integer, _
   ByVal lpString As String, _
   ByVal cch As Integer) As Integer

   Structure POINTAPI
       Dim X As Integer
       Dim Y As Integer
   End Structure

   Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Integer
   Private Declare Function WindowFromPointXY Lib "user32" Alias "WindowFromPoint" _
   (ByVal xPoint As Integer, ByVal yPoint As Integer) As Integer

   Private Declare Function GetParent Lib "user32" (ByVal hwnd As Integer) As Integer
   'Para recorrer todos los botones
   Private Declare Function GetWindow Lib "user32" _
   (ByVal hwnd As Integer, _
   ByVal wCmd As Integer) As Integer
   Private Const GW_CHILD = 5
   Private Const GW_HWNDFIRST = 0
   Private Const GW_HWNDLAST = 1
   Private Const GW_HWNDNEXT = 2
   Private Const GW_HWNDPREV = 3
   Private Const GW_MAX = 5
   Private Const GW_OWNER = 4


   Public Function TextoBoton() As String
       Dim pt32 As POINTAPI
       Dim ptx As Long
       Dim pty As Long
       Dim x As Long
       Dim hw As Long
       Dim hWndParent As Long
       Dim TextWindow As String
       TextoBoton = ""
       TextWindow = Space(100)
       Call GetCursorPos(pt32)                ' obtiene la posición del cursor
       ptx = pt32.X
       pty = pt32.Y
       hw = WindowFromPointXY(ptx, pty) ' Obtiene el handle debajo del cursor
       hWndParent = GetParent(hw) ' Consigue el handle padre de una ventana
       x = GetWindowText(hWndParent, TextWindow, 100) 'Obtiene el texto de la ventana
       If VB.Left(TextWindow, x) = "Calculadora" Then
           x = GetWindowText(hw, TextWindow, 100) 'Obtiene el texto de un botón
           TextoBoton = VB.Left(TextWindow, x)
       End If
       Return TextoBoton
   End Function


   Public Sub RecorrerBotones()
       Dim hw As Long
       Dim x As Long
       Dim TextWindow As String
       TextWindow = Space(100)
       hw = FindWindow("SciCalc", vbNullString)
       hw = FindWindowEx(hw, &H0, "Button", vbNullString) 'obtiene el primer handle de un botón
       Do While VB.Left(TextWindow, x) <> "C "
           hw = GetWindow(hw, GW_HWNDNEXT) '<--- Esto permite obtener y pasar al siguiente Handle de la lista
           x = GetWindowText(hw, TextWindow, 100) 'Obtiene el texto de un botón
           If x > 0 Then
               ListBox1.Items.Add(VB.Left(TextWindow, x))
           End If
           Application.DoEvents()
       Loop
   End Sub

   Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
       Dim hw As Long
       hw = FindWindow("SciCalc", vbNullString)
       SendMessage(hw, WM_SYSCOMMAND, SC_CLOSE, &H0) 'Cierra la calculadora
       End
   End Sub
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Timer1.Enabled = False
       Timer1.Interval = 1
       Button1.Text = "Abrir calculadora"
   End Sub

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Shell("Calc", vbNormalFocus)
       Timer1.Enabled = True
       RecorrerBotones()
   End Sub

   Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       'Para obtener el texto del botón donde se encuentra el cursor
       Label1.Text = TextoBoton()
       Me.Text = TextoBoton()
   End Sub
End Class



#714
Lo he intentado #Miseryk# pero pasa que cuando se crea un form, no con el create windows, sino con el que proporciona VB6 por defecto, entonces éste ignora cualquier referencia al ClassName o cualquier intento de cambio, porque este form depende directamente del archivo msvbvm60.dll que se encuentra \system32.

El fomoso nombre de clase ThunderRT6FormDC que se establece en el viejo VB6, está establecido en el archivo msvbvm60.dll.

De modo que si se modifica el archivo con un editor hexadecimal, por ejemplo con Hex Editor al ejecutar cualquier apliación compilada con VB6, ésta tendrá el nombre de clase que se haya establecido en este archivo.

No se puede modificar el nombre  ThunderRT6FormDC en una sola línea, si no que se tiene que hacer por partes:

ThunderRT6 en:
73180  36 00 00 00 00 00 00 00 54 68 75 6e 64 65 72 52
73190  54 36 00 55 8b ec 56 8b 75 08 8b 46 28 f6 40 2a

Form en:
00fb10   46 6f 72 6d 00 00 00 00 4c 69 6e 65 00 00 00

DC en:   
28a90   DC  00 00 44 46 72 61 6d 65 00 00 00 00 00


Cuando la aplicación se ejecute en otro SO, con el archivo original msvbvm60.dll, entonces el nombre de clase de nuevo será  ThunderRT6FormDC.

Si el archivo ya modificado, está en la mísma carpeta del EXE creado con VB6 entonces, el nombre de clase será el establecido en el archivo que hemos modificado, independiéntemente que en \system32 esté el original. Porque el EXE recurre al archivo msvbvm60.dll inmediato del directorio y no lo busca en \system32.










#715
Perdón no me di cuenta que lo tienes en VB.Net. Naturalmente que te da error, porque el código que he puesto es de VB6

Aquí lo tienes en VB.Net
Código (vbnet) [Seleccionar]
Option Explicit On
Option Strict On

Public Class Form1

   Private Sub Button1_Click( _
       ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click
       ListBox1.Items.Clear()
       WebBrowser1.Navigate(TextBox1.Text.Trim)

   End Sub

   Private Sub WebBrowser1_DocumentCompleted( _
       ByVal sender As System.Object, _
       ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) _
       Handles WebBrowser1.DocumentCompleted

       If e.Url.ToString = String.Empty Or e.Url.ToString = "http:///" Then
           Exit Sub
       End If
       Try
           Me.Cursor = Cursors.WaitCursor

           Call links()

           Me.Cursor = Cursors.Default

       Catch ex As Exception
           Debug.Print(ex.Message.ToString)
       End Try

   End Sub

   'Extrae los links
   ' ''''''''''''''''''''''''''''''''
   Private Sub links()

       ListBox1.Items.Clear()
       For i As Integer = 0 To WebBrowser1.Document.Links.Count - 1
           ListBox1.Items.Add(WebBrowser1.Document.Links.Item(i).GetAttribute("href"))
       Next

   End Sub

   Private Sub Form1_Load( _
       ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles MyBase.Load
       Button1.Text = "Cargar página y obtener links "
       Button2.Text = "Guardar lista"
       WebBrowser1.Visible = True
       TextBox1.Text = "www.google.com"

   End Sub


   Public Shared Function Guardar_Archivo_Texto(ByVal strTexto As String, ByVal FileName As String) As Long
       Guardar_Archivo_Texto = 0
       Dim sw As New System.IO.StreamWriter(FileName)
       sw.WriteLine(strTexto)
       sw.Close()
       Return Guardar_Archivo_Texto
   End Function

   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       Dim strListado As String = ""
       'Intruduce la lista en 'Listado'
       For x = 0 To ListBox1.Items.Count - 1
           strListado = strListado & ListBox1.Items(x).ToString & vbCrLf
       Next x
       'Guarda la lista
       Guardar_Archivo_Texto(strListado, System.Windows.Forms.Application.StartupPath & "\Listado.txt")
       '////Notas:
       'Guardar_Archivo_Texto (Lista, directorio y archivo)
       'System.Windows.Forms.Application.StartupPath <---Es el directorio donde se encuentra  esta apliación
   End Sub
End Class





Esto es lo que he añadido:


Código (vbnet) [Seleccionar]
    Public Shared Function Guardar_Archivo_Texto(ByVal strTexto As String, ByVal FileName As String) As Long
        Guardar_Archivo_Texto = 0
        Dim sw As New System.IO.StreamWriter(FileName)
        sw.WriteLine(strTexto)
        sw.Close()
        Return Guardar_Archivo_Texto
    End Function

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim strListado As String = ""
        'Intruduce la lista en 'Listado'
        For x = 0 To ListBox1.Items.Count - 1
            strListado = strListado & ListBox1.Items(x).ToString & vbCrLf
        Next x
        'Guarda la lista
        Guardar_Archivo_Texto(strListado, System.Windows.Forms.Application.StartupPath & "\Listado.txt")
        '////Notas:
        'Guardar_Archivo_Texto (Lista, directorio y archivo)
        'System.Windows.Forms.Application.StartupPath <---Es el directorio donde se encuentra  esta apliación
    End Sub

#716
Código (vb) [Seleccionar]
Option Explicit
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Dim N  As Integer
Private Sub Timer1_Timer()
Dim i As Integer
If GetAsyncKeyState (vbKeyLButton) < 0 Then
  N = N + 1
Else
  N = 0
End If
Label1.Caption = N
End Sub
 
Private Sub Form_Load()
   ' intervalo para el timer
   Timer1.Interval = 50
End Sub
#717
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.






#718
Código (vb) [Seleccionar]
Private Sub Command1_Click()
Dim Listado As String
'Intruduce la lista en 'Listado'
For x = 0 To List1.ListCount - 1
Listado = Listado & List1.List(x) & vbCrLf
Next x

'Guarda el listado
GuardarArchivoTexto Listado, App.Path & "\Listado.txt"
End Sub

Private Sub Form_Load()
List1.AddItem "1. ABC"
List1.AddItem "2. DEF"
List1.AddItem "3. GHI"
End Sub

Public Function GuardarArchivoTexto(ByVal strTexto As String, ByVal FileName As String)
Dim File As Integer, Cont As Integer, cDato As String
On Error GoTo EvitarError
   File = FreeFile
Open FileName For Binary As #File
For Cont = 1 To Len(strTexto)
   Put #File, Cont, strTexto
   Close #File
Next
EvitarError:
Select Case Err.Number
   Case 91
   Resume Next
End Select
End Function


Para cargar el archivo en el listBox puedes usar el código que facilito en esta pregunta (Respuesta no. 7#)
http://foro.elhacker.net/programacion_visual_basic/ayuda_con_saltos_de_linea-t430913.0.html

#719
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.
#720
Hola
Llevo tiempo intentando semitransparentar un picture o una sólo una parte de un formulario. A día de hoy no lo he conseguido. No me importa que sea con vb6 o vb.net


He hecho un poquito de trampa, para simular el efecto. Aquí dejo una muestra de lo que quiero. Pero repito, que sólo simula el efecto.

1 Formulario: Form1
1 Formulario: Form2 (establecer como BorderStyle=0)
1 PictureBox en Form1
1 PictureBox en Form2
1 Control Timer en el Form1: Timer1


En un MÓDULO:

Código (vb) [Seleccionar]

Option Explicit
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
'Obtiene posición de una ventana u objeto
Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
 Left As Long
 Top As Long
 Right As Long
 Bottom As Long
End Type

Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA = &H2
Private Const WS_EX_LAYERED = &H80000

 
Public Function CreateObjectTransparent(ByVal frmMain As Form, ByVal frmObj As Form, objPic As PictureBox, ByVal Alpha As Integer)
Dim i
frmObj.Show
frmObj.ZOrder 1
Transparencia frmObj.hwnd, Alpha
objPic.BackColor = &HFF00FF
AnularColor frmMain.hwnd, &HFF00FF
EnableWindow frmObj.hwnd, 0

End Function
'Función que aplica la transparencia, se le pasa el hwnd del form y un valor de 0 a 100
Public Function Transparencia(ByVal hwnd As Long, NivelTrans As Integer) As Long
Dim X As Long
On Error Resume Next
NivelTrans = (NivelTrans * 255) / 100

  X = GetWindowLong(hwnd, GWL_EXSTYLE)
  X = X Or WS_EX_LAYERED
  SetWindowLong hwnd, GWL_EXSTYLE, X
  'Establece la transparencia
  SetLayeredWindowAttributes hwnd, 0, NivelTrans, LWA_ALPHA

If Err Then
  Transparencia = 2
End If
End Function
'Función que aplica la transparencia, se le pasa el hwnd del form y un valor de 0 a 255
Public Function AnularColor(ByVal hwnd As Long, Color As Long) As Long
Dim X As Long
On Error Resume Next
      X = GetWindowLong(hwnd, GWL_EXSTYLE)
      X = X Or WS_EX_LAYERED
      SetWindowLong hwnd, GWL_EXSTYLE, X
      'Establece la transparencia
      SetLayeredWindowAttributes hwnd, Color, 0, &H1
      AnularColor = 0
If Err Then
AnularColor = 2
End If
End Function


Public Sub ResizeOjb(ByVal objPic As PictureBox, ByVal frmObj As Form)
Dim r As RECT, s As RECT, N
N = GetWindowRect(objPic.hwnd, r)
frmObj.Move r.Left * 15 - 200, r.Top * 15 - 200, objPic.Width + 400, objPic.Height + 400
End Sub




En un FORMULARIO:

Código (vb) [Seleccionar]

Private Sub Form_Load()
Form2.Picture1.BackColor = vbBlack
CreateObjectTransparent Form1, Form2, Picture1, 50
End Sub

Private Sub Form_Unload(Cancel As Integer)
Unload Form2
End Sub

Private Sub Timer1_Timer()
ResizeOjb Picture1, Form2
End Sub



Lo que hago es transparentar completamente el Picture1 del Form1 y luego semitransparentar el Form2 que contiene otro Picture. Obtengo la posición del Picture1 del Form1 y muevo y redimiensiono el Form2 al Picture1 del Form1. Coloco el Form2 debajo del Form1 y de esta manera creo el efecto de semitransperancia tan solo en un parte del Form1. Ademas he agrandado un poco el Form2 con respecto al Picture1 del Form1 para que al mover el formulario no se formen huecos ya que al mover muy rápido no le da tiempo a recolocar el Form2, lo bastante como para que se vean huecos si se mueve demasaido rápido

Este método que he utilizado NO me permite interactuar con el PictureBox semitransparente. Si que es posible quitando "EnableWindow frmObj.hwnd, 0" pero entonces al hacer clic en el Picture del Form2, éste se coloca delante del Form1. Ya he probado Zorder. No sirve queda un poco chapucero.

Esto  lo pongo como ejemplo pero no es lo que quiero. Lo ideal sería poder solo semitranspertentar una parte del Form o un Picture.



Saludos.


==============
Esto es una imagen que encontré googleando. Algo así me hiría de miedo. Como se ve en la imagen los controles no son transparentes pero el form sí.