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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Crear un formulario fantasma (solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Crear un formulario fantasma (solucionado)  (Leído 1,592 veces)
okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
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)



« Última modificación: 11 Marzo 2015, 11:35 am por okik » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema onsubmit formulario! [SOLUCIONADO]
Desarrollo Web
pisagatos 2 3,479 Último mensaje 27 Agosto 2010, 14:42 pm
por pisagatos
[Solucionado] Imprimir formulario y dataGridView (c#)
.NET (C#, VB.NET, ASP)
Hartigan 8 18,478 Último mensaje 17 Septiembre 2010, 00:53 am
por Hartigan
[Solucionado] Problema con formulario
PHP
Caster 5 2,718 Último mensaje 27 Diciembre 2011, 16:02 pm
por Caster
Crear Formulario Pdf
Programación General
elpipo 2 1,981 Último mensaje 30 Octubre 2012, 09:41 am
por elpipo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines