Problemas con Shell_NotifyIcon
Hay un área empotrada en la barra de tareas del escritorio de Windows, que muestra el reloj del sistema y algunos iconos. Esta área rectangular es el área de estado de la barra de tareas de Windows (área de estado de la barra de tareas). Este artículo presentará la programación del área de estado de la barra de tareas usando Borland Delphi, es decir, cómo mostrar el ícono de la aplicación en el área de estado de la barra de tareas.
---- Principio de implementación
---- Agregar, eliminar y modificar íconos en el área de estado de la barra de tareas se implementa a través de la función API de Windows Shell_NotifyIcon, que es proporcionada por Provided. por la biblioteca de enlaces dinámicos SHELL32.DLL de Windows. En Delphi, la función Shell_NotifyIcon se declara en la unidad ShellAPI y su
---- prototipo de función es el siguiente:
---- function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData ): BOOL; stdcall;
---- El valor del parámetro dwMessage determina el tipo de operación que realizará la función Shell_NotifyIcon. /p>
---- NIM_ADD (el valor es 0): inserta un icono en el área de estado de la barra de tareas.
---- NIM_DELETE (el valor es 1): elimina un icono del área de estado de la barra de tareas.
---- NIM_MODIFY (el valor es 2): modifica el icono, la información de solicitud o el mensaje de notificación en el área de estado de la barra de tareas.
----El parámetro lpData es un puntero a un tipo de registro (tipo de estructura). El tipo de registro NotifyIconData se define de la siguiente manera:
NOTIFYICONDATA = registro
<. p> cbSize: DWORD;Wnd: HWND;
uID: UINT;
uFlags: UINT
uCallbackMessage: UINT;
hIcon: HICON;
szTip: matriz [0..63] de AnsiChar
fin
---- cbSize: tamaño del registro NOTIFYICONDATA.
---- Wnd: el identificador de ventana asociado con este icono del área de estado. Esta ventana será responsable de procesar el mensaje uCallbackMessage.
---- uID: El identificador del icono del área de estado personalizado por el programa.
---- uFlags: Este campo indica qué valores de los tres miembros uCallbackMessage, hIcon y szTip en el registro NOTIFYICONDATA son válidos. Su valor puede ser una combinación de los siguientes tres (u operación):
---- NIF_MESSAGE (el valor es 1): el elemento uCallbackMessage contiene información válida.
---- NIF_ICON (el valor es 2): El elemento hIcon contiene información válida.
---- NIF_TIP (el valor es 4): El elemento szTip contiene información válida.
---- uCallbackMessage: Identificador de mensaje definido por el programa (entero de 32 bits). Cuando el mouse se mueve o hace clic en el ícono del área de estado (es decir, ocurre un evento del mouse), el sistema operativo enviará un mensaje uCallbackMessage a la ventana especificada por Wnd.
En el mensaje uCallbackMessage, el parámetro lParam contiene el tipo de mensaje del mouse de Windows y el parámetro wParam contiene el identificador de icono (uID). Los mensajes válidos del mouse incluyen los siguientes: WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONUP, WM_MBUTTONUP, WM_MOUSEMOVE, WM_LBUTTONDBLCLK, WM_RBUTTONDBLCLK y WM_MBUTTONDBLCLK.
---- hIcon: especifica un identificador de icono.
---- szTip: Información del consejo que se muestra en el icono (menos de 63 caracteres).
---- Implementación en Delphi
---- De la introducción anterior, no es difícil ver que la programación del área de estado de la barra de tareas maneja principalmente dos aspectos del trabajo. : Agregar, eliminar, modificar íconos y procesar mensajes de notificación. Se pueden agregar, eliminar y modificar íconos llamando a la función Shell_NotifyIcon. Para mensajes de notificación personalizados, debemos procesarlos en el bucle de mensajes.
---- El siguiente ejemplo brinda ejemplos de cómo agregar, modificar y eliminar íconos en el área de estado, así como el marco de procesamiento básico de los mensajes de notificación de íconos.
unidad Unidad1;
interfaz
usa
Windows, Mensajes, SysUtils, Clases, Gráficos,
Controles, formularios, cuadros de diálogo, ExtCtrls, ShellAPI
const
WM_TRAYNOTIFY=WM_USER+1;//Definir tipo de mensaje de notificación
TForm1 = clase(TForm)
Temporizador1: TTimer;
procedimiento FormCreate(Remitente: TObject);
procedimiento Timer1Timer(Remitente: TObject); p> p>
procedimiento FormDestroy(Remitente: TObject);
privado
{ Declaraciones privadas }
público
{ Declaraciones públicas }
procedimiento WndProc(var Msg: TMessage);
fin
var
Form1: TForm1; /p >
nd0, nd1:NotifyIconData;
hs:array[0..9]de LongWord
implementación
{$R *; .DFM }
procedimiento TForm1.FormCreate(Sender: TObject);
begin
//Carga los 10 recursos de iconos Icon0..Icon9,
Y guarda sus identificadores.
//Los iconos Icon0..Icon9 corresponden a los nueve números 0..9 respectivamente.
hs[0]:=LoadIcon(hInstancia, 'Icon0');
hs[1]:=LoadIcon(hInstancia, 'Icon1'); > hs[2]:=LoadIcon(hInstancia, 'Icono2');
hs[3]:=LoadIcon(hInstancia, 'Icono3');
hs[4]: =LoadIcon(hInstancia, 'Icon4');
hs[5]:=LoadIcon(hInstancia, 'Icon5');
hs[6]:=LoadIcon(hInstancia, ' Icon6');
hs[7]:=LoadIcon(hInstancia, 'Icon7');
hs[8]:=LoadIcon(hInstancia, 'Icon8'); p> p>
hs[9]:=LoadIcon(hInstance, 'Icon9');
//Rellene la variable de registro NotifyIconData nd0
nd0.cbSize := sizeof (NotifyIconData );
nd0.Wnd := mango;
nd0.uID := 0
nd0.uFlags := NIF_MESSAGE o NIF_ICON o NIF_TIP;
p>
nd0.uCallbackMessage := WM_TRAYNOTIFY
nd0.hIcon := hs[0]
StrPLCopy(nd0.szTip, ' ¡Hola, mundo!', 63 );
//Rellene la variable de registro NotifyIconData nd1
nd1.cbSize := sizeof(NotifyIconData
nd1); Wnd := mango;
p>
nd1.uID :=
nd1.uFlags := NIF_MESSAGE o NIF_ICON o NIF_TIP
nd1; .uCallbackMessage := WM_TRAYNOTIFY;
nd1.hIcon := hs[0];
StrPLCopy(nd1.szTip, 'Simon ama a Daisy', 63
<); p> //Agregar un ícono al área de estado de la barra de tareasShell_NotifyIcon(NIM_ADD, @nd0);
Shell_NotifyIcon(NIM_ADD, @nd1);
procedimiento TForm1.Timer1Timer( Remitente: TObject
var
st:SystemTime
begin
<; p> //Actualiza el ícono cada segundo: ícono 0 Muestra las decenas de segundos,El ícono 1 muestra las unidades de segundos.
GetLocalTime(st);
nd0.hIcon:= hs[st.wSecond div 10];
nd1.hIcon:= hs[st.wSecond] mod 10];
//Modificar el icono en el área de estado de la barra de tareas
Shell_NotifyIcon(NIM_MODIFY, @nd0);
Shell_NotifyIcon(NIM_MODIFY, @nd1); ;
end;
procedimiento TForm1.FormDestroy(Sender: TObject);
comenzar
//Eliminar el icono de la barra de tareas. área de estado Eliminar
Shell_NotifyIcon(NIM_DELETE, @nd0);
Shell_NotifyIcon(NIM_DELETE, @nd1); /Procesando mensaje de notificación
procedimiento TForm1.WndProc(var Msg: TMessage);
var
IconID:integer
pt: TPOINT;
comenzar
si msg.Msg = WM_TRAYNOTIFY entonces
comenzar
{
En la notificación mensaje, El parámetro wParam es el uID del icono,
El parámetro lParam es el tipo de evento del mouse.
}
iconID := msg.WParam;
//Obtener la posición del mouse en la pantalla
GetCursorPos(pt ) ;
// La estructura básica del procesamiento de mensajes de notificación es la siguiente:
case msg.lParam de
WM_LBUTTONDOWN:
comenzar
//Se presiona el botón derecho del mouse
fin
WM_RBUTTONDOWN:
comenzar
//El botón izquierdo del ratón La tecla está presionada
end
WM_LBUTTONUP:
comenzar
//Suelta el botón izquierdo del ratón
fin;
WM_RBUTTONUP:
comenzar
//Suelta el botón derecho del ratón
fin; /p>
WM_MOUSEMOVE:
comenzar
//Pase el mouse sobre el ícono
finalizar
WM_LBUTTONDBLCLK:
comenzar
//Doble clic con el botón izquierdo del mouse
finalizar
WM_RBUTTONDBLCLK:
comenzar <; /p>
//Doble clic con el botón derecho del ratón
end;
end; //finalizar caso
end
else//Llame al método WndProc de la clase principal para procesar otros mensajes
heredado
end
end.