Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: _Sergi_ en 26 Septiembre 2005, 20:15 pm



Título: Proceso
Publicado por: _Sergi_ en 26 Septiembre 2005, 20:15 pm
Bueno hace algun tiempo hice un programilla en VB que me resolvía muchíiiisimos problemas solo con ejecutarlo.
Pero es un proceso largo, y estoy pensando en añadirle una opcion para minimizarlo al tray.

Mis preguntas son dos:

-Con los códigos que circulan por la Red para añadir un icono al tray... ¿El Timer que realiza las operaciones periodicamente seguirá haciéndolo, aunque el form este minimizado en el susodicho tray?

-Se les ocurre alguna manera de que el icono del tray muestre un color segun como de avanzado vaya el progreso?
(ej. verde terminado, rojo empezando, naranja a mitad)
Gracias por vuestro tiempo!
Saludos


Título: Re: Proceso
Publicado por: NYlOn en 26 Septiembre 2005, 22:44 pm
Hola Acosta:
el codigo para poner un icono el la barra de tareas es este:

En un modulo, pone este
Código:
Public nid As NOTIFYICONDATA
Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Public Const WM_CHAR = &H102
Public Const WM_SETTEXT = &HC
Public Const WM_USER = &H400
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_CLOSE = &H10
Public Const WM_COMMAND = &H111
Public Const WM_CLEAR = &H303
Public Const WM_DESTROY = &H2
Public Const WM_GETTEXT = &HD
Public Const WM_GETTEXTLENGTH = &HE
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uId As Long
uFlags As Long
uCallBackMessage As Long
hIcon As Long
szTip As String * 64
End Type
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const WM_MOUSEMOVE = &H200
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

'Iconos
Sub Icono()
With nid
.cbSize = Len(nid)
.hwnd = Form1.hwnd 'nombre del form que estara minimizado
.uId = vbNull
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uCallBackMessage = WM_MOUSEMOVE
.hIcon = Form1.Icon 'nombre del formulario que contiene el icono
End With
Shell_NotifyIcon NIM_ADD, nid
End Sub
Sub NoIcono()
Shell_NotifyIcon NIM_DELETE, nid
End Sub

Resto del codigo:
Código:
Private Sub Form_Load ()
Icono 'muestra el icono
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim Result As Long
    Dim msg As Long
    If Me.ScaleMode = vbPixels Then
    msg = X
    Else
    msg = X / Screen.TwipsPerPixelX
    End If
    Select Case msg
        Case 517 'click derecho en el icono
            Form1.PopupMenu mnuHola
        Case 514
            Result = SetForegroundWindow(Me.hwnd) 'click izquierdo en el icono
    End Select

End Sub

Private Sub Form_Unload(Cancel As Integer)
NoIcono 'para sacar el icono cuando cerras la aplicacion
End Sub

y para cambiar el icono segun el estado de tu aplicacion tenes q poner un ImageList y cargas las imagenes que necesitas. Despues pones el siguiente code en cada evento que necesites:
Código:
Private Sub Command1_Click()
    NoIcono
    Set Icon = ImageList1.ListImages(1).ExtractIcon 'en el (1) depende del lugar en que este tu imagen
    Icono
End Sub

esper0 q te haya sido util ;)
un salud0

G0nz4


Título: Re: Proceso
Publicado por: Slasher-K en 27 Septiembre 2005, 00:28 am
No creo que cambiandole el ícono al formulario funcione porque cambia el handle.

Lo mejor es eliminar el ícono (en este caso procedimiento NoIcono) y volver a crearlo (procedimiento Icono), sólo modificas un poco el procedimiento anterior para que le pase el handle al ícono que va a usar (propiedad Handle del objeto Icon del formulario o cualquier objeto IPictureDisp). El icono lo podés cargar desde un archivo o bien desde un recurso, que esto último es lo que se debería hacer.

El Timer sí sigue funcionando de la misma manera ya que es un mensaje que se le envía a la ventana y la ventana existe, sólo que está oculta.

Saludos.


Título: Re: Proceso
Publicado por: NYlOn en 27 Septiembre 2005, 00:35 am
Citar
No creo que cambiandole el ícono al formulario funcione porque cambia el handle.

Si, si funciona...
Escribi el code en vb y lo probe dsp xD

Ah, y que es eso de 'cargar el icono desde un recurso' ??
a que te referis con es0 ??

un salud0


Título: Re: Proceso
Publicado por: Slasher-K en 27 Septiembre 2005, 00:45 am
Creas un archivo de recursos, después guardas un ícono en el archivo y con la función LoadResPicture cargas el recurso especificando el identificador.

El identificador es un valor de tipo numérico o de cadena que viene a ser el nombre de un recurso. En el caso de las tablas de cadenas siempre es un número.

Por ejemplo el siguiente código cargaría un ícono dependiendo de un estado determinado

Código:
Const STATUS_BUSY = 1
Const STATUS_FREE = 2
Const STATUS_WAIT = 3

Sub LoadIcon(Status As Integer)
      Dim csPicture As IPictureDisp
      Dim sRsrc$

  Select Case Status
    Case STATUS_BUSY: sRsrc = "ICON1"
    Case STATUS_FREE: sRsrc = "ICON2"
    Case STATUS_WAIT: sRsrc = "ICON3"
  End Select
 
  Set csPicture = LoadResPicture(sRsrc, vbResIcon)
End Sub

Saludos.


Título: Re: Proceso
Publicado por: NYlOn en 27 Septiembre 2005, 01:35 am
:O

gracias Polux ;)

un salud0


Título: Re: Proceso
Publicado por: _Sergi_ en 28 Septiembre 2005, 19:30 pm
Lo mismo digo.

Muchas gracias otra vez a todos por la info y por los codes.


Título: Re: Proceso
Publicado por: NYlOn en 28 Septiembre 2005, 22:11 pm
de nada :)