¿Cómo puedo minimizar el programa VB y mostrarlo en la bandeja?
[Fuente: Desconocido | Reimpresión: www.cittm.net | Actualización: 2006-1-25]
Habrá mucho software en la bandeja del sistema al ejecutar Aparece un pequeño icono en el área (es decir, el área donde se muestra la hora en la esquina inferior derecha del escritorio), que sirve como señal de que el programa se está ejecutando. Podemos controlar el estado del programa a través de. el menú que aparece desde el icono pequeño. Este ejemplo proporciona un programa de bandeja completamente funcional. Podemos ver cómo usar la función API Shell_NotifyIcon para agregar, eliminar y cambiar el ícono de la bandeja y este ejemplo también demuestra cómo agregar un menú contextual y un mensaje flotante para el ícono de la bandeja. .
El programa (adjunto) utiliza funciones API como Shell_NotifyIcon, SendMessage, CallWindowProc, SetWindowLong, etc. Shell_NotifyIcon es la función principal, utilizada para agregar, eliminar y cambiar el ícono del área de la bandeja del sistema (barra de tareas).
Antes de utilizar la función API, debes declarar lo siguiente en el programa:
Declarar la función Shell_NotifyIcon Lib "shell32.dll" alias "Shell_NotifyIconA" (By By) NotifyIconA" ( ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
La siguiente tabla proporciona el significado de cada parámetro:
Parámetro: Significado
dwMessage es el valor de la configuración del mensaje, puede ser uno de los siguientes valores constantes: 0, 1, 2
NIM_ADD = 0 Agrega un icono a la barra de estado del sistema
NIM_MODIFY = 1 Modifica el icono en la barra de estado del sistema
NIM_DELETE = 2 elimina el ícono de la barra de estado del sistema
LpData se usa para pasar la variable de estructura de datos NOTIFYICONDATA La estructura es la siguiente: szTip es válido<. /p>
UCallbackMessage As Long número de mensaje
p>HIcon As Long El icono que se mostrará en la barra de estado
SzTip As String * 64 mensaje de aviso
Tipo final
Valor de retorno Largo, distinto de cero indica éxito, cero indica error
Antes de usar esta función API, debemos definir el tipo de estructura NOTIFYICONDATA:
Tipo público NOTIFYICONDATA
cbSize Mientras HWnd Mientras
Uid Mientras UFlags Mientras
UCallbackMessage Mientras
HIcon As Long
SzTip As String * 64
Tipo final
Luego defina una variable NOTIFYICONDATA TheData para registrar los datos para configurar el icono de la bandeja
Privar TheData como NOTIFYICONDATA
Entonces podemos usar Esta función configura el icono de la bandeja del sistema.
Icon.Handle 'frm.Icon.Handle apunta al icono del formulario principal
.UFlags = NIF_ICON
.UCallbackMessage = TRAY_CALLBACK
'Su función es para permitir devolver un mensaje, que se explica en la siguiente sección. .
.UFlags = .UFlags Or NIF_MESSAGE
.cbSize = Len(TheData)
Terminar con
Shell_NotifyIcon NIM_ADD, TheData
'De acuerdo con la definición NIM_ADD anterior, configúrelo en "Modo Agregar" y luego agregue
2. Icono Eliminar
Usar TheData
. UFlags = 0
Finalizar con
Shell_NotifyIcon NIM_DELETE, TheData
'Según la definición anterior de NIM_DELETE, configurado en "modo de eliminación"
3. Cambia el ícono
Usa TheData
.HIcon = pic.Handle
'pic es el PictureBox que guarda el archivo del ícono
.UFlags = NIF_ICON
End With
Shell_NotifyIcon NIM_MODIFY, TheData
'Según la definición anterior de NIM_MODIFY, configurado en "modo de cambio"
4 .Agregue una sugerencia flotante al ícono
Utilice TheData
.SzTip = tip amp vbNullChar
'tip es una cadena; que almacena información de propinas
. UFlags = NIF_TIP
'Especificar para establecer mensajes flotantes
End With
Shell_NotifyIcon NIM_MODIFY, TheData
'Según la definición anterior de NIM_MODIFY , Establezca el mensaje en NIM_MODIFY, TheData
'Establezca el mensaje en NIM_MODIFY
según la definición NIM_MODIFY anterior. MODIFICAR, configurar en "Modo Modificar"
A través del código anterior, podemos agregar, eliminar y cambiar el ícono de la bandeja del sistema según nuestras necesidades, y agregar un mensaje de alerta flotante en el ícono del sistema. Pero en este momento el icono de la bandeja está aislado y no podemos usarlo para controlar el comportamiento de la aplicación ¿Qué debemos hacer? No te preocupes, sigue leyendo….
Si descarga (descarga fuente) y ejecuta este programa de muestra, encontrará que si hacemos clic derecho en el icono de la bandeja, aparecerá un menú contextual. Si hace clic en el elemento del menú correspondiente, la ventana principal del programa cambiará en consecuencia, para que pueda controlar el comportamiento del programa. Cuando la ventana principal esté minimizada, si hacemos clic en el botón izquierdo del icono de la bandeja, la ventana volverá a su tamaño original. De hecho, la implementación de las funciones anteriores se basa en el mecanismo de paso de mensajes del sistema operativo WINDOWS. No es fácil comprender completamente este mecanismo, pero podemos entenderlo de acuerdo con el siguiente texto.
El sistema operativo WINDOWS es como el cerebro humano: recibe, procesa y envía diversa información a nuestros órganos (claro, esto es una metáfora de diversas aplicaciones), es decir, es una información. centro.
A cada aplicación (incluso a cada botón, etiqueta, formulario, etc. se le llama colectivamente ventana) se le asignará un proceso de ventana WINDOWPROC cuando se esté ejecutando, y el proceso de ventana recibirá y procesará mensajes del sistema operativo (de hecho, hay también una cola de mensajes), generalmente el proceso de ventana es designado por el sistema operativo, y responderá y procesará automáticamente algunos mensajes de WINDOWS (como movimiento de ventana, maximización, minimización, mensajes de error, etc.). Bueno, hagamos una pregunta por ahora: ¿pueden estos mensajes ser procesados por el programa que escribimos nosotros mismos? La respuesta es sí, pero ¿cómo utilizar funciones API que también tienen funciones potentes? Echemos un vistazo a las definiciones y parámetros de estas funciones API.
El programa utiliza funciones API como SendMessage, CallWindowProc y SetWindowLong. La función SendMessage se usa para enviar mensajes a una ventana determinada; la función CallWindowProc se usa para enviar mensajes a un proceso de ventana determinado; La función SetWindowLong se utiliza para establecer las propiedades de la estructura de la ventana para la ventana especificada.
Antes de usar la función API, debe declarar la siguiente función en el programa:
Declarar la función CallWindowProc Lib "user32" alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declarar función SetWindowLong Lib "user32" alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long p>
Función de declaración privada SendMessage Lib "user32" Alias "SendMessageA " (ByVal HWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
El significado El conjunto de estos parámetros es el siguiente: Se muestra:
Función CallWindowProc
Significado del parámetro
lpPrevWndFunction lpPrevWndFunc dirección larga y original del procedimiento de ventana
HWnd largo, identificador de ventana
p>El mensaje es largo, el mensaje a enviar
wParam es largo, el tipo de mensaje, consulte la lista de parámetros de wParam
lParam es largo, varía según el parámetro wParam
lParam Long, varía según el parámetro wParam
Función WindowProc Larga, varía según el parámetro wParam
Valor de retorno Largo, varía según el mensaje enviado Diferente
Función SetWindowLong:
Parámetro TDgt Significado
hwnd Largo, el identificador de la ventana para obtener información
nIndex Long, consulte la descripción del parámetro nIndex de la función GetWindowLong
dwNewLong Long, el nuevo valor de la información de la ventana especificada por nIndex
Valor de retorno Long, el valor anterior de los datos especificados
Función SendMessage:
Significado del parámetro
hwnd Long, el identificador de la ventana para recibir el mensaje
wMsg Long, el identificador del mensaje
wParam Long, depende del contenido del mensaje
lParam Any, depende del contenido del mensaje
Valor de retorno Largo, depende del mensaje
Primero debemos escribir nuestro propio programa para procesar el mensaje. Las propiedades de la ventana deben cambiarse de usar el procedimiento de ventana predeterminado para manejar mensajes a usar un controlador de mensajes. nosotros mismos escribimos.
El método consiste en utilizar la función SetWindowLong para obtener la dirección del procedimiento de ventana predeterminado y luego transferirla a la dirección del procedimiento de ventana que escribimos. El código de implementación específico es el siguiente:
'GWL_WNDPROC obtiene. dirección del procedimiento de ventana de la ventana. AddressOf es la función de dirección. NewWindowProc es el procedimiento que escribimos. Procedimiento
OldWindowProc = SetWindowLong(frm.HWnd, GWL_WNDPROC, GWL_WNDPROC, GWL_WNDPROC, GWL_WNDPROC, GWL_WNDPROC).HWnd, GWL_WNDPROC, AddressOf
NewWindowProc)
Luego escriba el siguiente código en la función NewWindowProc y preste atención a los siguientes puntos El TRAY_CALLBACK rojo en. el código es un mensaje del ícono del área de la bandeja Para permitir que el ícono de la bandeja envíe un mensaje, debe agregar Al especificar el ícono de la bandeja:
Función pública NewWindowProc(ByVal HWnd As Long, ByVal Msg As. Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'Si el usuario hace clic en el icono de la bandeja,
Si Msg = TRAY_CALLBACK, entonces
'Si se hace clic en el botón izquierdo
Si lParam = WM_LBUTTONUP, entonces
'El estado del formulario se minimiza
Si TheForm.WindowState = vbMuttonup , entonces