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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: 1 ... 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 [74] 75 76 77 78 79 80
731  Programación / Programación Visual Basic / Crear un formulario fantasma (solucionado) en: 10 Marzo 2015, 17:32 pm
Hola amigos,

Llevaba no se ya ni cuanto tiempo, buscando una forma de colocar un formulario en el fondo del escritor y que permaneciera ahí como si formara parte del mismo, como un gadget.

Ayer me puse a experimentar con la declaración API, SetLayeredWindowAttributes y modificando el valor dwNewLong  de SetWindowLong y ¡Sorpresa! El formulario permanece siempre en el escritorio y no se puede tocar, ni mover, ni cerrar, ni nada, pero si que se puede ver. Tampoco aparece al pulsar Alt+Tab. Y cuando haces clic en él con el ratón, es como si no existiera. En definitiva, un formulario fantasma. No se cual será el término correcto.

Funciona con el Handle (HWND), de modo que se puede aplicar a cualquier ventana.


He hecho un ejemplo. Es un gigantesco reloj del sistema que se muestra en el escritorio.

Se necesita:
- Un formulario
- Un control PictureBox (para mostra el reloj)
- Un control Timer    (para actualizar reloj)

Modifica las propiedades del form a:
BorderStyle = 0
ShowInTaskbar =False

Esto es para un MÓDULO:

Código
  1. '//////////////////////////////////////////////////////////////////
  2. '//////////////////////////////////////////////////////////////////
  3. '/////Establece el estilo de un formulario a modo fantastasma./////
  4. '/////Características:                                        /////
  5. '/////-Permenece siempre en el fondo del escritorio.          /////
  6. '/////-Es visible.                                            /////
  7. '/////-No se activa mediante el puntero del ratón.            /////
  8. '/////-No se puede mover.                                     /////
  9. '/////-No se puede colocar encima de otro formulario.         /////
  10. '/////-No se puede activar mediante  ALT + TAB.               /////
  11. '/////-Cuando haces clic con el ratón sobre él, se comporta   /////
  12. '///// como si el formulario no existiera. De modo que en el  /////
  13. '///// escritorio aparecerán los menús flotantes o el cuadro  /////
  14. '///// de selección tal y como si no estuviera.               /////
  15. '//////////////////////////////////////////////////////////////////
  16. '//////////////////////////////////////////////////////////////////
  17. '/////////////////////Creado por OKIK//////////////////////////////
  18. '//////////////////////////////////////////////////////////////////
  19.  
  20. Option Explicit
  21. Private Declare Function SetWindowPos Lib "user32" _
  22. (ByVal Hwnd As Long, _
  23. ByVal hWndInsertAfter As Long, _
  24. ByVal X As Long, _
  25. ByVal y As Long, _
  26. ByVal cx As Long, _
  27. ByVal cy As Long, _
  28. ByVal wFlags As Long) As Long
  29. Const HWND_TOP = 0
  30. Const HWND_BOTTOM = 1
  31. Const HWND_TOPMOST = -1
  32. Const HWND_NOTOPMOST = -2
  33. Private Const SWP_NOSIZE = &H1
  34. Private Const SWP_NOMOVE = &H2
  35.  
  36. 'Declaración del Api SetLayeredWindowAttributes _
  37. que establece la transparencia al form
  38. Private Declare Function SetLayeredWindowAttributes Lib "user32" _
  39. (ByVal Hwnd As Long, _
  40. ByVal crKey As Long, _
  41. ByVal bAlpha As Byte, _
  42. ByVal dwFlags As Long) As Long
  43.  
  44. 'Recupera el estilo de la ventana
  45. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
  46. (ByVal Hwnd As Long, _
  47. ByVal nIndex As Long) As Long
  48.  
  49. 'Establece un valor del 32bits para una compensación especificada en la memoria de la ventana extra
  50. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  51. (ByVal Hwnd As Long, _
  52. ByVal nIndex As Long, _
  53. ByVal dwNewLong As Long) As Long
  54.  
  55. Public Const LWA_ALPHA = &H2               'Crea una capa alfa (transparencia)
  56. Public Const LWA_NULLCOLOR = &H1           'Anula un color especificado
  57. Public Const LWA_ALPHA_NULLCOLOR = &H3     'Crea una capa alfa y anula un color especificado
  58. Public Const LWA_NORMAL = &H0              'Normal, sin trasnparencia y sin anulación color
  59. Public Const RMV_COLOR_BLACK = &H0         'Color para anular (negro)
  60. Public Const RMV_COLOR_MAGENTA = &HFF00FF  'Color para anular (magenta)
  61. Private Const GWL_EXSTYLE = (-20)
  62. Private Const WS_EX_LAYERED = &H80000       'Estilo de capa
  63. Private Const WS_EX_GHOSTFORM = &H64        'Estilo fantasma
  64.  
  65. Private Function SendFormBottom(ByVal Hwnd As Long)
  66. 'Envia el formulario al fondo la primera vez que se ejecuta
  67. SetWindowPos Hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
  68. End Function
  69. Public Function SetGhostForm(ByVal Hwnd As Long, _
  70. ByVal NivelTransparencia As Integer, _
  71. ByVal NullColor As Long, _
  72. ByVal TypeLayer As Long) As Long
  73. Dim X As Long
  74. Dim lpPrevWndProc As Long
  75. On Error Resume Next
  76.       X = GetWindowLong(Hwnd, GWL_EXSTYLE)
  77.       X = X Or WS_EX_LAYERED Or WS_EX_GHOSTFORM
  78.       SetWindowLong Hwnd, GWL_EXSTYLE, X
  79.       NivelTransparencia = Int(((NivelTransparencia * 255) / 100) + 0.5)
  80.       SetLayeredWindowAttributes Hwnd, NullColor, NivelTransparencia, TypeLayer
  81.       SetGhostForm = 0
  82.       SendFormBottom Hwnd
  83. If Err Then
  84. SetGhostForm = 2
  85. End If
  86. End Function
  87.  
  88.  

Y esto para el FORMULARIO

Código
  1. Private Sub Form_Activate()
  2. 'SetGhostForm (Handle, Trasnparencia, Color para anular, Tipo de capa)
  3. 'Mantiene el formulario siempre abajo
  4. Call SetGhostForm(Me.Hwnd, 45, RMV_COLOR_BLACK, LWA_ALPHA_NULLCOLOR)
  5. End Sub
  6.  
  7. Private Sub Form_Load()
  8.    With Picture1
  9.        .Font = "Arial"
  10.        .ForeColor = vbGreen
  11.        .BackColor = vbBlack
  12.        .FontSize = 100
  13.        .AutoRedraw = True
  14.        .Move 0, 0, 8000, 2000
  15.        .BorderStyle = 0
  16.    End With
  17.    Timer1.Enabled = True
  18.    Timer1.Interval = 1
  19. End Sub
  20. Private Sub Form_Resize()
  21.    Me.Move Screen.Width - Me.Width - 100, 0, _
  22.    Picture1.Width, Picture1.Height
  23. End Sub
  24.  
  25. Private Sub Timer1_Timer()
  26.    With Picture1
  27.        Picture1.Cls
  28.        Picture1.CurrentX = 150
  29.        Picture1.CurrentY = 15
  30.        Picture1.Print Time
  31.    End With
  32. End Sub
  33.  

Lo malo es que los accesos directos no se superponen sobre el formulario, sino que se quedan debajo. Pero lo curioso es que aunque estén debajo, si haces doble clic sobre ellos (con el form encima), se pueden mover o ejecutar igualmente.

He hecho lo del reloj sólo como un ejemplo de utilidad, pero para crear un formulario fantasma basta con hacer la llamada a SetGhostForm que se encuentra en el módulo.  No funciona desde Form_Load, solo en Form_Resize y Form_Activate


Si no quieres transparencia, ni remover ningún color, usa LWA_NORMAL:

Call SetGhostForm(Me.Hwnd, 0, 0, LWA_NORMAL)


Si solo quieres transparencia usa LWA_ALPHA y estableces un valor entre 0 y 100, cuanto menor sea el valor más transparente se volverá el formulario:

Call SetGhostForm(Me.Hwnd, 100, 0, LWA_ALPHA)


LWA_ALPHA_NULLCOLOR, permite hacer las dos cosas:

Call SetGhostForm(Me.Hwnd, 50, RMV_COLOR_BLACK, LWA_ALPHA_NULLCOLOR)

732  Programación / Programación Visual Basic / Refrescar Escritorio de Windows y Explorador de Carpetas (solucionado) en: 10 Marzo 2015, 16:52 pm
Hola,
He buscado y rebuscado en la red y finalmente encontré la forma de refrescar el escritorio de windows y el Explorador de carpetas (Explorer)

Esto sirve para cuando cambias valores en el registro directamente desde tu programa, en lugar de usar Opciones de Carpeta. Por ejemplo, ocultar las extensiones de archivo, mostrar archivos ocultos o  mostrar vistas en miniaturas en lugar de iconos. Al refrescar automáticamente se muestran los cambios; si deshabilitas las extensiones de archivo, al refrescar (actualizar) se ocultan las extensiones.

Yo intuía que debía usar PostMessage o SendMessage, lo que no sabía era que comando usar. Finalmente los encontré pero referido a otros tipos de lenguaje, no para VB. He encontrado otras formas con VB pero no funcionaban o solamente funcionaban para el escritorio. Como explico más abajo, todo se tiene que hacer por separado: escritorio, explorador de windows y actualizar iconos.


Código completo y definitivo para refrescar el escritorio, el explorador de carpetas y ACTUALIZAR LOS ICONOS en XP/Vista/¿Windows 7/8?:

Código
  1. Option Explicit
  2. Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
  3. (ByVal hwnd As Long, ByVal wMsg As Long, _
  4. ByVal wParam As Long, ByVal lParam As Long) As Long
  5. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  6. (ByVal hwnd As Long, ByVal wMsg As Long, _
  7. ByVal wParam As Long, lParam As Any) As Long
  8. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  9. (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  10. Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
  11. (ByVal hWnd1 As Long, _
  12. ByVal hWnd2 As Long, _
  13. ByVal lpsz1 As String, _
  14. ByVal lpsz2 As String) As Long
  15.  
  16. Private Const WM_COMMAND = &H111
  17. Private Const SC_REFRESH_DESKTOP = &H7103
  18. Private Const SC_REFRESH_EXPLORER_VISTA = &HA220
  19. Private Const SC_REFRESH_EXPLORER_XP = &H7FEF
  20.  
  21. 'Función para actualizar los iconos
  22. Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" _
  23. (ByVal hwnd As Long, ByVal msg As Long, _
  24. ByVal wParam As Long, ByVal lParam As Long, _
  25. ByVal fuFlags As Long, ByVal uTimeout As Long, _
  26. lpdwResult As Long) As Long
  27.  
  28. Private Const WM_SETTINGCHANGE = &H1A
  29. Private Const HWND_BROADCAST = &HFFFF&
  30. Private Const SPI_SETNONCLIENTMETRICS = 42
  31. Private Const SMTO_ABORTIFHUNG = &H2
  32.  
  33.  
  34. Public Function RefreshDesktop()
  35. Dim hwProgMan As Long, hwDesktop As Long, hwExplorer As Long
  36.  
  37. 'Refresca el escritorio
  38. hwProgMan = FindWindow("Progman", "Program Manager")
  39. hwDesktop = FindWindowEx(hwProgMan, &H0, "SHELLDLL_DefView", vbNullString)
  40. PostMessage hwDesktop, WM_COMMAND, SC_REFRESH_DESKTOP, &H0
  41.  
  42. 'Refresca explorer
  43. 'VISTA/¿Windows 7/8?
  44. hwExplorer = FindWindow("CabinetWClass", vbNullString)
  45. PostMessage hwExplorer, WM_COMMAND, SC_REFRESH_EXPLORER_VISTA, &H0
  46. 'XP
  47. hwExplorer = FindWindow("ExploreWClass", vbNullString)
  48. PostMessage hwExplorer, WM_COMMAND, SC_REFRESH_EXPLORER_XP, &H0
  49.  
  50. 'Actualiza los iconos
  51. Call SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, &H0, SMTO_ABORTIFHUNG, &H1, &H0)
  52. End Function
  53.  
  54. Private Sub Command1_Click()
  55. RefreshDesktop
  56. End Sub

'//////////////////
Tuve una errata ayer con el nombre de clase del explorador de windows para Windows XP; le añadí una R de más. La culpa es de google :¬¬ Como no estaba seguro busqué ahí y encontre referencias escrito así y bueno, esa es la escusa. Lo he corregido :D.

El nombre de clase de Explorer para XP es: "ExploreWClass". Con toda seguridad, lo he comprobado personalmente.

De todos modos el código o comando para refrescar Explorer en XP es diferente que en Vista o Windows 7. De modo que tampoco iba a funcionar aunque hubiera escrito bien el nombre de clase. Ayer comprobé cual era el comando a usar con spy++ y lo he añadido.

He añadido además el código para actualizar los iconos porque no se actualizaban los iconos. Esto es, cuando cambias el icono por defecto de una determinada extensión de archivo directamente en el registro de windows y quieres ver los cambios sin tener que cerrar sesión o simular un cambio en Opciones de carpeta.

No me extraña que no encontrara la forma de refrescar windows. Parece ser que hay que hacerlo todo por separado, por un lado el escritorio, por el otro Explorer y por el otro actualizar los iconos.


Como se puede ver, en XP el código wParam es &H7FEF=32751. Lo he testado y ¡funciona!.
733  Programación / Programación Visual Basic / Re: [BrainMind] Busco Programadores Capacitados en: 10 Marzo 2015, 16:18 pm
Ahora estoy muy liado... pero gracias
734  Programación / .NET (C#, VB.NET, ASP) / Re: Solucionar Error NullReferenceException en VB.Net 2010 en: 6 Marzo 2015, 17:46 pm
Ya se porqué se produce el error:

Porque primer tiene que estar cargada la página. Como no encuentra la colección de controles se produce un error.

Pare evitar el error puede ponerse la condición:
Código
  1. If (WebBrowser1.Document IsNot Nothing) Then
  2. ...
  3. end if
  4.  

Y por supuesto esperar a que cargue la página.
735  Programación / .NET (C#, VB.NET, ASP) / Solucionar Error NullReferenceException en VB.Net 2010 en: 6 Marzo 2015, 16:52 pm
Hola,

Se trata de un código para loggear. Rellena de forma automático al login de una página.

Código
  1. Dim theElementCollection As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("Input")
  2.            For Each curElement As HtmlElement In theElementCollection
  3.                Dim controlName As String = curElement.GetAttribute("id").ToString
  4.                If controlName = idUser Then
  5.                    curElement.SetAttribute("Value", UserName)
  6.                End If
  7.            Next


El error se produce en ("Input").y es "NullReferenceException"---> "Referencia a objeto no establecida como instancia de objeto"

Si coloco el código en el evento WebBrowser1_DocumentCompleted entonces no se produce ningún error pero me interesa introducirlo en un evento Click de un botón.


Nota:

idUser  es una variable string con el id del control de la página donde hay que introducir el nombre de usuario

UserName es una variable string para el nombre del usuario

736  Foros Generales / Dudas Generales / Re: ¿Sacar el texto que muestra de una imagen? en: 4 Marzo 2015, 11:30 am
Pues como te han respondido más arriba con un OCR. El sofware de los escáneres disponen de OCR. Creo que todos o casi todos.

Hay programas muy buenos completos diseñados especialmente para ello como el Omnipage.

Pero es importante que la imagen fotografiada sea clara sin zonas borrosas. Además debe ser letra de máquina, no manual. Porque cada persona tiene una letra particular y reconocer eso es muy complicado.
 
737  Programación / Programación Visual Basic / Re: [BrainMind] Busco Programadores Capacitados en: 4 Marzo 2015, 11:14 am
Pues como sugerencia, en un juego así a mi me gustaría que el juego no se limitara a preguntar o que el jugador muestre su conocimiento sino que también orientase al jugador explicando echos históricos a modo de introducción y en tiempo  de juego a modo de historia y con escritos, para que uno pueda buscar una determinada información y motivar al jugador a buscar la información para poder superar determinas pruebas. Pero esto nunca de forma forzada, porque resulta muy engorroso tener que esperar a un vídeo o lo que sea y no poder salir hasta que termine. Es mejor que el propio usuario lo quiera visualizar o leer determinada información por voluntad propia.

En cuanto a algo científico pues igual.

Pero la ciencia y la historia son pesos pesados del conocimiento y haría falta la supresión de un experto o expertos para no fastidiarla con datos e información errónea.



yo soy programador aficionado, no 'capacitado' así que en eso, no te puedo ayudar.


738  Programación / Programación Visual Basic / Re: [BrainMind] Busco Programadores Capacitados en: 3 Marzo 2015, 16:44 pm
"los jugadores puedan demostrar sus conocimientos en amplios temas, ya sean Historia, Cine, Literatura, Etc,"

En el mundo de los videojuegos, esto no funciona. A no ser que sea por encargo para alguna un centro educativo específico o algo así.

Saludos
739  Programación / Programación Visual Basic / Re: ¿cual es el futuro de vb clasico? en: 26 Febrero 2015, 13:43 pm
La verdad es que Visual Studio 6.0 resulta muy práctico para hacer programas sencillos, rápidos y sin necesidad de ser un genio de la programación.

Estaría bien que Microsoft sacara una versión "Classic" actualizada para aquellos usuarios que antes usaban VB6 o siguen usándolo por su sencillez, facilidad de uso y lo rápido que se puede hacer programas. También iría muy bien para aquellos que se inician en la programación.

La verdad es que todavía se pueden hacer programas con un aspecto actualizado y funcionales en cualquier SO de Microsoft, utilizando funciones API, clases, ocx integrados y archivos de recurso.
740  Seguridad Informática / Hacking / Re: Como protegerme de intrusiones y sniffing en un red Wifi pública en: 25 Febrero 2015, 19:31 pm
El problema es que odio Linux  :¬¬
Páginas: 1 ... 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 [74] 75 76 77 78 79 80
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines